diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1249ec1 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/spring-boot-11.iml b/.idea/spring-boot-11.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/spring-boot-11.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..82af7fa --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + 1728617608300 + + + + \ No newline at end of file diff --git a/Leiame.md b/Leiame.md deleted file mode 100644 index fb96140..0000000 --- a/Leiame.md +++ /dev/null @@ -1,79 +0,0 @@ -# Code Challenge Java - -## Desafio Overview: - -Você tem a tarefa de criar um aplicativo da Web que permita aos usuários criar e gerenciar suas listas de tarefas. O aplicativo deve consistir em uma página da Web responsiva construída em React e uma API construída em Java Spring Boot para armazenar e gerenciar as listas de tarefas. - -### Os Repositórios -- **Frontend**: Construído com React. Você também pode escolher outro framework React, se preferir. -- **Backend**: Construído com Java Spring Boot, utilizando qualquer banco de dados de sua escolha (por exemplo, MySQL, PostgreSQL, MongoDB ou em memória). - -### O Layout -Consulte o [mockup do layout](https://www.figma.com/file/sQrUVHTlyogq3qGdkqGTXN/mockup?node-id=7%3A2&t=ANTOTiqjqGWYuoUr-0) nas versões desktop e mobile. Siga este design o mais fielmente possível. - -### Funcionalidades Requeridas: - -1. Os usuários devem ser capazes de **criar**, **ler**, **atualizar** e **excluir** itens de tarefas usando a API. -2. Os usuários devem poder **marcar um item como favorito**. -3. Os usuários devem poder **atribuir uma cor** a cada item de tarefa. -4. O frontend React deve exibir a lista de tarefas do usuário de forma responsiva e visualmente atraente, com a capacidade de **filtrar** por itens favoritos e cor. -5. Os itens favoritos devem aparecer no topo da lista. - -### Requisitos Técnicos: -1. **API de Backend**: - - Construído usando **Java Spring Boot**. - - Use qualquer banco de dados de sua escolha (por exemplo, PostgreSQL, MongoDB, em memória, etc.). -2. **Frontend**: - - Construído usando **React** e ferramentas modernas de desenvolvimento web. -3. **Design Responsivo**: - - O aplicativo deve ser totalmente responsivo, proporcionando uma experiência perfeita em dispositivos desktop e mobile. - -### Entregáveis: - -1. Um link para um repositório GitHub contendo o código-fonte completo tanto para o **backend** quanto para o **frontend**. -2. Uma descrição por escrito de como configurar e executar o aplicativo localmente. - -### Critério de Avaliação: - -1. **Qualidade do Código**: Código bem estruturado e de fácil manutenção. -2. **Formato do Código**: Consistente e segue as melhores práticas. -3. **Desempenho do Código**: Soluções eficientes e escaláveis. -4. **Design de Frontend**: Uma interface de usuário amigável e visualmente atraente. -5. **Legibilidade**: O código é fácil de entender e manter? -6. **Abordagem Mobile-First**: O design deve priorizar a responsividade móvel. -7. **Responsabilidade do Código**: Separação clara de responsabilidades (frontend vs. backend). -8. **Funcionalidade Completa**: O app atende a todos os requisitos funcionais listados? -9. **Capacidade de Resposta**: O aplicativo funciona bem em diferentes tamanhos de tela? -10. **Boas Práticas**: Uso de ferramentas modernas de desenvolvimento web e padrões. -11. **Design**: O aplicativo segue o mockup fornecido? -12. **Documentação**: Código bem documentado e instruções de configuração claras. - -### Backend: -1. **Java**: Versão 11+ -2. **Framework**: Spring Boot -3. **Banco de Dados**: Escolha o seu, ou use um banco de dados em memória (por exemplo, H2). - -### Frontend: -1. **Node**: ^16.15.0 -2. **NPM**: ^8.5.5 -3. **Framework**: React -4. **CSS**: Sass ou outro pré-processador de sua escolha. - -### Quer Nos Impressionar Ainda Mais? - -1. Defina corretamente tipos e interfaces. -2. Configure e aplique regras do **ESLint**. -3. Crie uma configuração do **Prettier** para formatação consistente. -4. Containerize o app com **Docker**. -5. Escreva **testes** unitários e de integração. -6. Configure pipelines de **CI/CD** para testes e deploy automatizados. - -### Instruções para Submissão: - -1. Crie um arquivo `PULL_REQUEST.md` onde você descreva o processo, decisões tomadas e quaisquer detalhes importantes sobre a implementação. -2. Crie uma solicitação pull para os repositórios **backend** e **frontend** usando o mesmo nome de branch. -3. Envie-nos o pull request e pronto! - ---- - -Boa sorte! 🚀 \ No newline at end of file diff --git a/README.md b/README.md index f805762..fbce2a8 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,40 @@ -# Code Challenge Java +# Como usar -## Challenge Overview: +## Backend -You are tasked with building a web application that allows users to create and manage their to-do lists. The application should consist of a responsive webpage built in React, and an API built in Java Spring Boot to store and manage the to-do lists. +Foi utilizado o docker para usar a aplicação localmente. Comando para subir um container com o MySQL: -### The Repositories -- **Frontend**: Built with React. You can also choose another React framework if you prefer. -- **Backend**: Built with Java Spring Boot, utilizing any database of your choice (e.g., MySQL, PostgreSQL, MongoDB, or in-memory). +`docker-compose up` -### The Layout -Refer to the provided [layout mockup](https://www.figma.com/file/sQrUVHTlyogq3qGdkqGTXN/mockup?node-id=7%3A2&t=ANTOTiqjqGWYuoUr-0) for both desktop and mobile versions. Please follow this design as closely as possible. +Para executar os testes foi utilizado o banco em memória h2, então basta rodar o script. -### Functionality Requirements: +## Frontend -1. Users should be able to **create**, **read**, **update**, and **delete** to-do items using the API. -2. Users should be able to **mark an item as a favorite**. -3. Users should be able to **assign a color** to each to-do item. -4. The React frontend should display the user's to-do list in a responsive and visually appealing manner, with the ability to **filter** by favorite items and color. -5. Favorited items should appear at the top of the list. +Para instalar as dependências, deve-se usar o seguinte comando: -### Technical Requirements: -1. **Backend API**: - - Built using **Java Spring Boot**. - - Use any database of your choice (e.g., PostgreSQL, MongoDB, in-memory, etc.). -2. **Frontend**: - - Built using **React** and modern web development tools. -3. **Responsive Design**: - - The application should be fully responsive, providing a seamless experience across desktop and mobile devices. +`yarn` -### Deliverables: +Para iniciar, deve-se usar o seguinte comando: -1. A link to a GitHub repository containing the complete source code for both the **backend** and **frontend**. -2. A written description of how to set up and run the application locally. +`yarn start` -### Evaluation Criteria: +Versão node: -1. **Code Quality**: Well-structured and maintainable code. -2. **Code Format**: Consistent and follows best practices. -3. **Code Performance**: Efficient and scalable solutions. -4. **Frontend Design**: A user-friendly, visually appealing interface. -5. **Readability**: Is the code easy to understand and maintain? -6. **Mobile-First Approach**: The design should prioritize mobile responsiveness. -7. **Code Responsibility**: Clean separation of concerns (frontend vs. backend). -8. **Feature Completeness**: Does the app meet all the listed functional requirements? -9. **Responsiveness**: Does the app work well across different screen sizes? -10. **Best Practices**: Use of modern web tools and standards. -11. **Design**: Does the app follow the provided design mockup? -12. **Documentation**: Well-documented code and setup instructions. +`16.20.1` -### Backend: -1. **Java**: Version 11+ -2. **Framework**: Spring Boot -3. **Database**: Choose your own, or use an in-memory database (e.g., H2). +Para facilitar o uso inicial da aplicação, foi criado uma classe que cria vários registros. Nessa criação será adicionado um usuário com todas as permissões, exceto a master. Segue login abaixo: -### Frontend: -1. **Node**: ^16.15.0 -2. **NPM**: ^8.5.5 -3. **Framework**: React -4. **CSS**: Sass or another preprocessor of your choice. +```markdown +username: alex +password: abc123 +``` -### Want to Impress Us Even More? +# Detalhes da implementação -1. Correctly define types and interfaces. -2. Set up and enforce **ESLint** rules. -3. Create a **Prettier** configuration for consistent formatting. -4. Containerize the app with **Docker**. -5. Write unit and integration **tests**. -6. Set up **CI/CD** pipelines for automated testing and deployment. +- Adicionei um simples comportamento de autenticação e autorização onde cada funcionalidade tem a sua devida permissão; -### Instructions for Submission: +- Cada usuário poderá apenas acessar as suas anotações (implementação pelo frontend, aqui poderia ter bloqueado no backend também); -1. Create a file `PULL_REQUEST.md` in which you describe your process, the decisions you made, and any important details about the implementation. -2. Create a pull request for both the **backend** and **frontend** repositories using the same branch name. -3. Send us the pull request and you're done! +- Foi criado uma outra tela para gerenciar as anotações/tarefas, inclusive filtrar pela data de criação; ---- - -Good luck! 🚀 \ No newline at end of file +- Apenas usuário com a permissão master pode editar os usuários, caso contrário só poderá editar o seu usuário. diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..7ed0d6b --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,32 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/backend/.mvn/wrapper/MavenWrapperDownloader.java b/backend/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..e76d1f3 --- /dev/null +++ b/backend/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/backend/.mvn/wrapper/maven-wrapper.jar b/backend/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..2cc7d4a Binary files /dev/null and b/backend/.mvn/wrapper/maven-wrapper.jar differ diff --git a/backend/.mvn/wrapper/maven-wrapper.properties b/backend/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..642d572 --- /dev/null +++ b/backend/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml new file mode 100644 index 0000000..c134c2d --- /dev/null +++ b/backend/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.1' +services: + db: + image: mysql + container_name: mysql + environment: + MYSQL_ROOT_PASSWORD: root + ports: + - "3306:3306" + volumes: + - data_docker:/var/lib/mysql + +volumes: + data_docker: diff --git a/backend/mvnw b/backend/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/backend/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/backend/mvnw.cmd b/backend/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/backend/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/backend/pom.xml b/backend/pom.xml new file mode 100644 index 0000000..bf0efab --- /dev/null +++ b/backend/pom.xml @@ -0,0 +1,170 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.5.RELEASE + + + + com.corelab + springboot + 0.0.1-SNAPSHOT + springboot + Spring Boot + + + 11 + 1.4.1.Final + 3.8.1 + 1.4.8 + + + + + org.springdoc + springdoc-openapi-ui + ${springdoc-openapi-ui.version} + + + + org.springdoc + springdoc-openapi-data-rest + ${springdoc-openapi-ui.version} + + + + org.springdoc + springdoc-openapi-security + ${springdoc-openapi-ui.version} + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.mapstruct + mapstruct + ${org.mapstruct.version} + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + mysql + mysql-connector-java + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + com.h2database + h2 + test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + com.github.javafaker + javafaker + 0.15 + + + + io.jsonwebtoken + jjwt + 0.9.0 + + + + org.modelmapper + modelmapper + 2.3.8 + + + + + + integration-tests + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/*Test.* + **/*IT.* + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 11 + 11 + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + + diff --git a/backend/src/main/java/com/corelab/springboot/SpringbootApplication.java b/backend/src/main/java/com/corelab/springboot/SpringbootApplication.java new file mode 100644 index 0000000..9e9dcee --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/SpringbootApplication.java @@ -0,0 +1,13 @@ +package com.corelab.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringbootApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringbootApplication.class, args); + } + +} diff --git a/backend/src/main/java/com/corelab/springboot/client/SpringClient.java b/backend/src/main/java/com/corelab/springboot/client/SpringClient.java new file mode 100644 index 0000000..a0f85f8 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/client/SpringClient.java @@ -0,0 +1,21 @@ +package com.corelab.springboot.client; + +import lombok.extern.log4j.Log4j2; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.Arrays; +import java.util.List; + +@Log4j2 +public class SpringClient { + public static void main(String[] args) { + } + + private static HttpHeaders createJsonHeader() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + return httpHeaders; + } +} diff --git a/backend/src/main/java/com/corelab/springboot/config/ConfigPaths.java b/backend/src/main/java/com/corelab/springboot/config/ConfigPaths.java new file mode 100644 index 0000000..98540a6 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/config/ConfigPaths.java @@ -0,0 +1,19 @@ +package com.corelab.springboot.config; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpMethod; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ConfigPaths { + + private String path; + private HttpMethod method; + private String role; + +} diff --git a/backend/src/main/java/com/corelab/springboot/config/CorsConfiguration.java b/backend/src/main/java/com/corelab/springboot/config/CorsConfiguration.java new file mode 100644 index 0000000..48f494e --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/config/CorsConfiguration.java @@ -0,0 +1,16 @@ +package com.corelab.springboot.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfiguration implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedMethods("*"); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/corelab/springboot/config/DemoData.java b/backend/src/main/java/com/corelab/springboot/config/DemoData.java new file mode 100644 index 0000000..552d212 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/config/DemoData.java @@ -0,0 +1,75 @@ +package com.corelab.springboot.config; + +import com.corelab.springboot.domain.Task; +import com.corelab.springboot.domain.User; +import com.corelab.springboot.domain.enums.Authorize; +import com.corelab.springboot.repository.TaskRepository; +import com.corelab.springboot.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class DemoData implements CommandLineRunner { + + private BCryptPasswordEncoder pe; + private UserRepository repo; + private TaskRepository taskRepository; + + @Autowired + DemoData(UserRepository repo, BCryptPasswordEncoder pe, TaskRepository taskRepository) { + this.repo = repo; + this.pe = pe; + this.taskRepository = taskRepository; + } + + @Override + public void run(String...args) throws Exception { + + + User user = new User(1L, "Alex", "alex", pe.encode("abc123"), "1,2,3,4,5,6,7,8"); + repo.saveAndFlush(user); + + List tasks = new ArrayList<>(); + for(int i = 1; i < 20; i ++) { + tasks.add(Task.builder() + .title("Atividade 1") + .detail("tenha atenção") + .color("#FFF") + .favorite(true) + .user(user) + .date(new GregorianCalendar(2024, 7, 1, 1, 1).getTime()) + .id(Long.parseLong(String.valueOf(i))) + .build()); + } + + tasks.add(Task.builder() + .title("Limpar a casa") + .detail("Não esquecer") + .color("#FFF") + .favorite(true) + .user(user) + .date(new GregorianCalendar(2024, 8, 1, 1, 1).getTime()) + .id(22L) + .build()); + tasks.add(Task.builder() + .title("Lavar a louça") + .detail("Amanhã irá precisar") + .color("#FFF") + .favorite(true) + .user(user) + .date(new GregorianCalendar(2024, 9, 1, 1, 1).getTime()) + .id(23L) + .build()); + + tasks.forEach(task -> { + taskRepository.saveAndFlush(task); + }); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/config/EnumHttpStatus.java b/backend/src/main/java/com/corelab/springboot/config/EnumHttpStatus.java new file mode 100644 index 0000000..eef1d4e --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/config/EnumHttpStatus.java @@ -0,0 +1,8 @@ +package com.corelab.springboot.config; + +public enum EnumHttpStatus { + GET, + POST, + PUT, + DELETE, +} diff --git a/backend/src/main/java/com/corelab/springboot/config/ModelMapperConfiguration.java b/backend/src/main/java/com/corelab/springboot/config/ModelMapperConfiguration.java new file mode 100644 index 0000000..616c9ce --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/config/ModelMapperConfiguration.java @@ -0,0 +1,14 @@ +package com.corelab.springboot.config; + +import org.modelmapper.ModelMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ModelMapperConfiguration { + + @Bean + public ModelMapper modelMapper() { + return new ModelMapper(); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/config/SecurityConfig.java b/backend/src/main/java/com/corelab/springboot/config/SecurityConfig.java new file mode 100644 index 0000000..6a6db34 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/config/SecurityConfig.java @@ -0,0 +1,59 @@ +package com.corelab.springboot.config; + +import com.corelab.springboot.security.JWTAuthenticationFilter; +import com.corelab.springboot.security.JWTAuthorizationFilter; +import com.corelab.springboot.security.JWTUtil; +import com.corelab.springboot.service.ConfigPathsService; +import com.corelab.springboot.service.UserDetailsService; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + + +@EnableWebSecurity +@Log4j2 +@RequiredArgsConstructor +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + private final ConfigPathsService configPathsService; + + @Autowired + private UserDetailsService userDetailsService; + + @Autowired + private JWTUtil jwtUtil; + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http.cors().and().csrf().disable(); + for (ConfigPaths configMock : configPathsService.generateMatchers()) { + http.authorizeRequests() + .antMatchers(configMock.getMethod(), configMock.getPath()).hasRole(configMock.getRole()); + } + http.authorizeRequests().anyRequest() + .authenticated(); + http.addFilter(new JWTAuthenticationFilter(authenticationManager(), jwtUtil)); + http.addFilter(new JWTAuthorizationFilter(authenticationManager(), jwtUtil, userDetailsService)); + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + } + + @Override + public void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); + } + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + +} diff --git a/backend/src/main/java/com/corelab/springboot/configurer/WebMvcConfigurer.java b/backend/src/main/java/com/corelab/springboot/configurer/WebMvcConfigurer.java new file mode 100644 index 0000000..9d00e4a --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/configurer/WebMvcConfigurer.java @@ -0,0 +1,19 @@ +package com.corelab.springboot.configurer; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.web.PageableHandlerMethodArgumentResolver; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; + +import java.util.List; + +@Configuration +public class WebMvcConfigurer implements org.springframework.web.servlet.config.annotation.WebMvcConfigurer { + + @Override + public void addArgumentResolvers(List resolvers) { + PageableHandlerMethodArgumentResolver pageHandler = new PageableHandlerMethodArgumentResolver(); + pageHandler.setFallbackPageable(PageRequest.of(0, 5)); + resolvers.add(pageHandler); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/controller/TaskController.java b/backend/src/main/java/com/corelab/springboot/controller/TaskController.java new file mode 100644 index 0000000..0cd6dd8 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/controller/TaskController.java @@ -0,0 +1,91 @@ +package com.corelab.springboot.controller; + +import com.corelab.springboot.domain.Task; +import com.corelab.springboot.dto.TaskListDTO; +import com.corelab.springboot.dto.TaskRequestDTO; +import com.corelab.springboot.service.TaskService; +import com.corelab.springboot.util.DateUtil; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.List; + +@RestController +@RequestMapping("task") +@Log4j2 +@RequiredArgsConstructor +public class TaskController { + private final TaskService taskService; + private final DateUtil dateUtil; + + @GetMapping + public ResponseEntity> list( + @RequestParam(required = false) Long userId, + @RequestParam(required = false) String title, + @RequestParam(required = false) String detail, + @RequestParam(required = false) String color, + @RequestParam(required = false) Boolean favorite, + @RequestParam(value = "dateInitial", required = false) Long dateInitial, + @RequestParam(value = "dateFinal", required = false) Long dateFinal, + @ParameterObject Pageable pageable) { + + return ResponseEntity.ok(taskService.listAll(userId, title, detail, color, favorite, dateUtil.getDate(dateInitial), dateUtil.getDate(dateFinal), pageable)); + } + + @GetMapping(path = "/all") + public ResponseEntity> listAll() { + return ResponseEntity.ok(taskService.listAllNonPageable()); + } + + @GetMapping(path = "/{id}") + public ResponseEntity findById(@PathVariable long id) { + return ResponseEntity.ok(taskService.findByIdDTOOrThrowBadRequestException(id)); + } + + @GetMapping(path = "by-id/{id}") + public ResponseEntity findByIdAuthenticationPrincipal(@PathVariable long id, + @AuthenticationPrincipal UserDetails userDetails) { + log.info(userDetails); + return ResponseEntity.ok(taskService.findByIdOrThrowBadRequestException(id)); + } + + @PostMapping + public ResponseEntity save(@RequestBody @Valid TaskRequestDTO teamPostRequestBody) { + return new ResponseEntity<>(taskService.save(teamPostRequestBody), HttpStatus.CREATED); + } + + @DeleteMapping(path = "/{id}") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "Successful Operation"), + @ApiResponse(responseCode = "400", description = "When Task Does Not Exist in The Database") + }) + public ResponseEntity delete(@PathVariable long id) { + taskService.delete(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PutMapping(path = "/{id}") + public ResponseEntity replace(@PathVariable Long id, @RequestBody TaskRequestDTO taskPutRequestBody) { + if(id != null) { + taskPutRequestBody.setId(id); + } + taskService.update(taskPutRequestBody); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + +} diff --git a/backend/src/main/java/com/corelab/springboot/controller/UserController.java b/backend/src/main/java/com/corelab/springboot/controller/UserController.java new file mode 100644 index 0000000..25c2427 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/controller/UserController.java @@ -0,0 +1,77 @@ +package com.corelab.springboot.controller; + +import com.corelab.springboot.domain.User; +import com.corelab.springboot.dto.UserListDTO; +import com.corelab.springboot.dto.UserRequestDTO; +import com.corelab.springboot.service.UserService; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("user") +@Log4j2 +@RequiredArgsConstructor +public class UserController { + private final UserService userService; + + @GetMapping + public ResponseEntity> list(@RequestParam(required = false) String name, + @RequestParam(required = false) String username, + @ParameterObject Pageable pageable) { + return ResponseEntity.ok(userService.listAll(name, username, pageable)); + } + + @GetMapping(path = "/all") + public ResponseEntity> listAll() { + return ResponseEntity.ok(userService.listAllNonPageable()); + } + + @GetMapping(path = "/{id}") + public ResponseEntity findById(@PathVariable long id) { + return ResponseEntity.ok(userService.findByIdDTOOrThrowBadRequestException(id)); + } + + @GetMapping(path = "by-id/{id}") + public ResponseEntity findByIdAuthenticationPrincipal(@PathVariable long id, + @AuthenticationPrincipal UserDetails userDetails) { + log.info(userDetails); + return ResponseEntity.ok(userService.findByIdOrThrowBadRequestException(id)); + } + + @PostMapping + public ResponseEntity save(@RequestBody @Valid UserRequestDTO userPostRequestBody) { + return new ResponseEntity<>(userService.save(userPostRequestBody), HttpStatus.CREATED); + } + + @DeleteMapping(path = "/{id}") + @ApiResponses(value = { + @ApiResponse(responseCode = "204", description = "Successful Operation"), + @ApiResponse(responseCode = "400", description = "When User Does Not Exist in The Database") + }) + public ResponseEntity delete(@PathVariable long id) { + userService.delete(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PutMapping(path = "/{id}") + public ResponseEntity replace(@PathVariable Long id, @RequestBody UserRequestDTO userPutRequestBody) { + if(id != null) { + userPutRequestBody.setId(id); + } + userService.update(userPutRequestBody); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/domain/Task.java b/backend/src/main/java/com/corelab/springboot/domain/Task.java new file mode 100644 index 0000000..0e9f26d --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/domain/Task.java @@ -0,0 +1,44 @@ +package com.corelab.springboot.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.Date; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Builder +public class Task { + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private Long id; + private String title; + private String detail; + private String color; + private Boolean favorite; + private Date date = new Date(); + @ManyToOne() + @JoinColumn(name = "user_id") + private User user; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Task task = (Task) o; + return Objects.equals(id, task.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/domain/User.java b/backend/src/main/java/com/corelab/springboot/domain/User.java new file mode 100644 index 0000000..fff8739 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/domain/User.java @@ -0,0 +1,87 @@ +package com.corelab.springboot.domain; + +import com.corelab.springboot.domain.enums.Authorize; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import javax.persistence.*; +import javax.validation.constraints.NotEmpty; +import java.util.*; +import java.util.stream.Collectors; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Builder +public class User implements UserDetails { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotEmpty(message = "The user's name cannot be empty") + private String name; + private String username; + private String password; + private String authorities; + @OneToMany(mappedBy = "user") + private Set tasks = new HashSet<>(); + + public User(Long id, String name, String username, String password, String authorities) { + this.id = id; + this.name = name; + this.username = username; + this.password = password; + this.authorities = authorities; + } + + public User(Long id) { + this.id = id; + } + + @Override + public Collection getAuthorities() { + if(this.authorities.isEmpty()) { + return new ArrayList(); + } + return Arrays.stream(this.authorities.split(",")) + .map(value -> Authorize.toEnum(Integer.parseInt(value)).getDescription()) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + } + + @Override + public String getPassword() { + return this.password; + } + + @Override + public String getUsername() { + return this.username; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/backend/src/main/java/com/corelab/springboot/domain/enums/Authorize.java b/backend/src/main/java/com/corelab/springboot/domain/enums/Authorize.java new file mode 100755 index 0000000..d9869f7 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/domain/enums/Authorize.java @@ -0,0 +1,58 @@ +package com.corelab.springboot.domain.enums; + +public enum Authorize { + + ROLE_USER_POST(1, "ROLE_USER_POST"), + ROLE_USER_PUT(2, "ROLE_USER_PUT"), + ROLE_USER_DELETE(3, "ROLE_USER_DELETE"), + ROLE_USER_GET(4, "ROLE_USER_GET"), + ROLE_TASK_POST(5, "ROLE_TASK_POST"), + ROLE_TASK_PUT(6, "ROLE_TASK_PUT"), + ROLE_TASK_DELETE(7, "ROLE_TASK_DELETE"), + ROLE_TASK_GET(8, "ROLE_TASK_GET"), + ROLE_USER_MASTER(9, "ROLE_USER_MASTER"); + + private int cod; + private String description; + + private Authorize(int cod, String description) { + this.cod = cod; + this.description = description; + } + + public int getCod() { + return cod; + } + + public String getDescription() { + return description; + } + + public static Authorize toEnum(Integer cod) { + if(cod == null) { + return null; + } + + for (Authorize x : Authorize.values()) { + if(cod.equals(x.getCod())) { + return x; + } + } + + throw new IllegalArgumentException("Id not found: " + cod); + } + + public static Authorize toEnum(String description) { + if(description == null) { + return null; + } + + for (Authorize x : Authorize.values()) { + if(description.equals(x.getDescription())) { + return x; + } + } + + throw new IllegalArgumentException("Description not found: " + description); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/CredentialsDTO.java b/backend/src/main/java/com/corelab/springboot/dto/CredentialsDTO.java new file mode 100755 index 0000000..7eb5d3f --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/CredentialsDTO.java @@ -0,0 +1,21 @@ +package com.corelab.springboot.dto; + + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CredentialsDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + private String username; + private String password; + +} \ No newline at end of file diff --git a/backend/src/main/java/com/corelab/springboot/dto/TaskListDTO.java b/backend/src/main/java/com/corelab/springboot/dto/TaskListDTO.java new file mode 100644 index 0000000..fcf955a --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/TaskListDTO.java @@ -0,0 +1,27 @@ +package com.corelab.springboot.dto; + +import com.corelab.springboot.domain.Task; +import com.corelab.springboot.domain.User; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import java.io.Serializable; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TaskListDTO implements Serializable { + private Long id; + private String title; + private String detail; + private String color; + private Boolean favorite; + private Date date; + private UserListTaskDTO user; +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/TaskListUserDTO.java b/backend/src/main/java/com/corelab/springboot/dto/TaskListUserDTO.java new file mode 100644 index 0000000..c529dd0 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/TaskListUserDTO.java @@ -0,0 +1,18 @@ +package com.corelab.springboot.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TaskListUserDTO implements Serializable { + private Long id; + private String title; + private String detail; + private String color; + private Boolean favorite; +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/TaskRequestDTO.java b/backend/src/main/java/com/corelab/springboot/dto/TaskRequestDTO.java new file mode 100644 index 0000000..e877558 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/TaskRequestDTO.java @@ -0,0 +1,22 @@ +package com.corelab.springboot.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class TaskRequestDTO { + + private Long id; + private String title; + private String detail; + private String color; + private Boolean favorite; + private Date date = new Date(); + private UserRequestTaskDTO user; +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/TokenDTO.java b/backend/src/main/java/com/corelab/springboot/dto/TokenDTO.java new file mode 100644 index 0000000..94cb36b --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/TokenDTO.java @@ -0,0 +1,18 @@ +package com.corelab.springboot.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TokenDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + private String token; + +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/UserListDTO.java b/backend/src/main/java/com/corelab/springboot/dto/UserListDTO.java new file mode 100644 index 0000000..b4ed4ab --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/UserListDTO.java @@ -0,0 +1,37 @@ +package com.corelab.springboot.dto; + +import com.corelab.springboot.domain.enums.Authorize; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; + +import java.io.Serializable; +import java.util.Collection; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserListDTO implements Serializable { + private Long id; + private String name; + private String username; + private String authorities; + + public void setAuthorities(String authorities) { + String authoritiesStr = authorities; + if (authorities.contains("[")) { + authorities = authorities.replaceAll("\\[", ""); + authorities = authorities.replaceAll("]", ""); + String[] list = authorities.split(", "); + authoritiesStr = ""; + for (String roleName : list) { + authoritiesStr += Authorize.toEnum(roleName).getCod() + ","; + } + authoritiesStr = authoritiesStr.substring(0, authoritiesStr.length() - 1); + } + + this.authorities = authoritiesStr; + } + +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/UserListTaskDTO.java b/backend/src/main/java/com/corelab/springboot/dto/UserListTaskDTO.java new file mode 100644 index 0000000..1a9a948 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/UserListTaskDTO.java @@ -0,0 +1,19 @@ +package com.corelab.springboot.dto; + +import com.corelab.springboot.domain.Task; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserListTaskDTO implements Serializable { + private Long id; + private String name; + private String username; +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/UserRequestDTO.java b/backend/src/main/java/com/corelab/springboot/dto/UserRequestDTO.java new file mode 100644 index 0000000..5c86bc5 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/UserRequestDTO.java @@ -0,0 +1,23 @@ +package com.corelab.springboot.dto; + +import com.corelab.springboot.domain.Task; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.util.HashSet; +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserRequestDTO { + + private Long id; + private String name; + private String username; + private String password; + private String authorities; + private Set tasks = new HashSet<>(); +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/UserRequestTaskDTO.java b/backend/src/main/java/com/corelab/springboot/dto/UserRequestTaskDTO.java new file mode 100644 index 0000000..cd4b948 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/UserRequestTaskDTO.java @@ -0,0 +1,22 @@ +package com.corelab.springboot.dto; + +import com.corelab.springboot.domain.Task; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.HashSet; +import java.util.Set; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserRequestTaskDTO { + + private Long id; + private String name; + private String username; + private String password; +} diff --git a/backend/src/main/java/com/corelab/springboot/dto/UserTokenDTO.java b/backend/src/main/java/com/corelab/springboot/dto/UserTokenDTO.java new file mode 100644 index 0000000..a6014ec --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/dto/UserTokenDTO.java @@ -0,0 +1,17 @@ +package com.corelab.springboot.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserTokenDTO implements Serializable { + private Long id; + private String username; + private String name; + private String authorities; +} diff --git a/backend/src/main/java/com/corelab/springboot/exception/BadRequestException.java b/backend/src/main/java/com/corelab/springboot/exception/BadRequestException.java new file mode 100644 index 0000000..201f9ff --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/exception/BadRequestException.java @@ -0,0 +1,11 @@ +package com.corelab.springboot.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.BAD_REQUEST) +public class BadRequestException extends RuntimeException{ + public BadRequestException(String message) { + super(message); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/exception/BadRequestExceptionDetails.java b/backend/src/main/java/com/corelab/springboot/exception/BadRequestExceptionDetails.java new file mode 100644 index 0000000..443e1cd --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/exception/BadRequestExceptionDetails.java @@ -0,0 +1,10 @@ +package com.corelab.springboot.exception; + +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +public class BadRequestExceptionDetails extends ExceptionDetails { + +} diff --git a/backend/src/main/java/com/corelab/springboot/exception/ExceptionDetails.java b/backend/src/main/java/com/corelab/springboot/exception/ExceptionDetails.java new file mode 100644 index 0000000..3024afe --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/exception/ExceptionDetails.java @@ -0,0 +1,16 @@ +package com.corelab.springboot.exception; + +import lombok.Data; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +@Data +@SuperBuilder +public class ExceptionDetails { + protected String title; + protected int status; + protected String details; + protected String developerMessage; + protected LocalDateTime timestamp; +} diff --git a/backend/src/main/java/com/corelab/springboot/exception/ValidationExceptionDetails.java b/backend/src/main/java/com/corelab/springboot/exception/ValidationExceptionDetails.java new file mode 100644 index 0000000..57a092e --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/exception/ValidationExceptionDetails.java @@ -0,0 +1,11 @@ +package com.corelab.springboot.exception; + +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +public class ValidationExceptionDetails extends ExceptionDetails { + private final String fields; + private final String fieldsMessage; +} diff --git a/backend/src/main/java/com/corelab/springboot/handler/RestExceptionHandler.java b/backend/src/main/java/com/corelab/springboot/handler/RestExceptionHandler.java new file mode 100644 index 0000000..1b31f0f --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/handler/RestExceptionHandler.java @@ -0,0 +1,73 @@ +package com.corelab.springboot.handler; + +import com.corelab.springboot.exception.BadRequestException; +import com.corelab.springboot.exception.BadRequestExceptionDetails; +import com.corelab.springboot.exception.ExceptionDetails; +import com.corelab.springboot.exception.ValidationExceptionDetails; +import lombok.extern.log4j.Log4j2; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.lang.Nullable; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@ControllerAdvice +@Log4j2 +public class RestExceptionHandler extends ResponseEntityExceptionHandler { + + @ExceptionHandler(BadRequestException.class) + public ResponseEntity handleBadRequestException(BadRequestException bre) { + return new ResponseEntity<>( + BadRequestExceptionDetails.builder() + .timestamp(LocalDateTime.now()) + .status(HttpStatus.BAD_REQUEST.value()) + .title("Bad Request Exception, Check the Documentation") + .details(bre.getMessage()) + .developerMessage(bre.getClass().getName()) + .build(), HttpStatus.BAD_REQUEST); + } + + @Override + protected ResponseEntity handleMethodArgumentNotValid( + MethodArgumentNotValidException exception, HttpHeaders headers, HttpStatus status, WebRequest request) { + List fieldErrors = exception.getBindingResult().getFieldErrors(); + + String fields = fieldErrors.stream().map(FieldError::getField).collect(Collectors.joining(", ")); + String fieldsMessage = fieldErrors.stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(", ")); + + return new ResponseEntity<>( + ValidationExceptionDetails.builder() + .timestamp(LocalDateTime.now()) + .status(HttpStatus.BAD_REQUEST.value()) + .title("Bad Request Exception, Invalid Fields") + .details("Check the field(s) error") + .developerMessage(exception.getClass().getName()) + .fields(fields) + .fieldsMessage(fieldsMessage) + .build(), HttpStatus.BAD_REQUEST); + } + + @Override + protected ResponseEntity handleExceptionInternal( + Exception ex, @Nullable Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { + + ExceptionDetails exceptionDetails = ExceptionDetails.builder() + .timestamp(LocalDateTime.now()) + .status(status.value()) + .title(ex.getCause().getMessage()) + .details(ex.getMessage()) + .developerMessage(ex.getClass().getName()) + .build(); + + return new ResponseEntity<>(exceptionDetails, headers, status); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/mapper/CustomerMapper.java b/backend/src/main/java/com/corelab/springboot/mapper/CustomerMapper.java new file mode 100644 index 0000000..24de9b2 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/mapper/CustomerMapper.java @@ -0,0 +1,13 @@ +package com.corelab.springboot.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = "spring") +public abstract class CustomerMapper { + public static final CustomerMapper INSTANCE = Mappers.getMapper(CustomerMapper.class); + +// public abstract Customer toCustomer(CustomerPostRequestBody animePostRequestBody); +// +// public abstract Customer toCustomer(CustomerPutRequestBody animePostRequestBody); +} diff --git a/backend/src/main/java/com/corelab/springboot/repository/TaskRepository.java b/backend/src/main/java/com/corelab/springboot/repository/TaskRepository.java new file mode 100644 index 0000000..9b44dd5 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/repository/TaskRepository.java @@ -0,0 +1,9 @@ +package com.corelab.springboot.repository; + +import com.corelab.springboot.domain.Task; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + + +public interface TaskRepository extends JpaRepository, JpaSpecificationExecutor { +} diff --git a/backend/src/main/java/com/corelab/springboot/repository/UserRepository.java b/backend/src/main/java/com/corelab/springboot/repository/UserRepository.java new file mode 100644 index 0000000..23fb11a --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/repository/UserRepository.java @@ -0,0 +1,10 @@ +package com.corelab.springboot.repository; + +import com.corelab.springboot.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface UserRepository extends JpaRepository, JpaSpecificationExecutor { + + User findByUsername(String username); +} diff --git a/backend/src/main/java/com/corelab/springboot/security/JWTAuthenticationFilter.java b/backend/src/main/java/com/corelab/springboot/security/JWTAuthenticationFilter.java new file mode 100755 index 0000000..46040fa --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/security/JWTAuthenticationFilter.java @@ -0,0 +1,83 @@ +package com.corelab.springboot.security; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.corelab.springboot.dto.CredentialsDTO; +import com.corelab.springboot.dto.TokenDTO; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + + private AuthenticationManager authenticationManager; + private JWTUtil jwtUtil; + + public JWTAuthenticationFilter(AuthenticationManager authenticationManager, JWTUtil jwtUtil) { + setAuthenticationFailureHandler(new JWTAuthenticationFailureHandler()); + this.authenticationManager = authenticationManager; + this.jwtUtil = jwtUtil; + } + + @Override + public Authentication attemptAuthentication(HttpServletRequest req, + HttpServletResponse res) throws AuthenticationException { + try { + CredentialsDTO creds = new ObjectMapper() + .readValue(req.getInputStream(), CredentialsDTO.class); + UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(creds.getUsername(), + creds.getPassword(), new ArrayList<>()); + Authentication auth = authenticationManager.authenticate(authToken); + return auth; + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + protected void successfulAuthentication(HttpServletRequest req, + HttpServletResponse res, + FilterChain chain, + Authentication auth) throws IOException, ServletException { + UserSS user = ((UserSS) auth.getPrincipal()); + String token = jwtUtil.generateToken(user.getId(), user.getUsername(), user.getName()); + res.addHeader("Authorization", "Bearer " + token); + res.addHeader("access-control-expose-headers", "Authorization"); + String json = new ObjectMapper().writeValueAsString(new TokenDTO(token)); + res.getWriter().write(json); + + } + + private class JWTAuthenticationFailureHandler implements AuthenticationFailureHandler { + @Override + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException, ServletException { + response.setStatus(401); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().append(json()); + } + + private String json() { + long date = new Date().getTime(); + return "{\"timestamp\": " + date + ", " + "\"status\": 401, " + "\"error\": \"Não autorizado\", " + + "\"message\": \"Usuário ou senha inválidos\", " + "\"path\": \"/login\"}"; + } + + + + } + +} diff --git a/backend/src/main/java/com/corelab/springboot/security/JWTAuthorizationFilter.java b/backend/src/main/java/com/corelab/springboot/security/JWTAuthorizationFilter.java new file mode 100755 index 0000000..9efcf59 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/security/JWTAuthorizationFilter.java @@ -0,0 +1,52 @@ +package com.corelab.springboot.security; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import io.jsonwebtoken.Claims; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; + +public class JWTAuthorizationFilter extends BasicAuthenticationFilter { + + private JWTUtil jwtUtil; + private UserDetailsService userDetailsService; + + public JWTAuthorizationFilter(AuthenticationManager authenticationManager, JWTUtil jwtUtil, UserDetailsService userDetailsService) { + super(authenticationManager); + this.jwtUtil = jwtUtil; + this.userDetailsService = userDetailsService; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, + HttpServletResponse response, + FilterChain chain) throws IOException, ServletException { + + String header = request.getHeader("Authorization"); + if (header != null && header.startsWith("Bearer ")) { + UsernamePasswordAuthenticationToken auth = getAuthentication(header.substring(7)); + if (auth != null) { + SecurityContextHolder.getContext().setAuthentication(auth); + } + } + chain.doFilter(request, response); + } + + private UsernamePasswordAuthenticationToken getAuthentication(String token) { + if (jwtUtil.tokenValido(token)) { + String username = jwtUtil.getUsername(token); + UserDetails user = userDetailsService.loadUserByUsername(username); + return new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); + } + return null; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/corelab/springboot/security/JWTUtil.java b/backend/src/main/java/com/corelab/springboot/security/JWTUtil.java new file mode 100755 index 0000000..f46f020 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/security/JWTUtil.java @@ -0,0 +1,73 @@ +package com.corelab.springboot.security; + +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import com.corelab.springboot.domain.User; +import com.corelab.springboot.domain.enums.Authorize; +import com.corelab.springboot.dto.UserTokenDTO; +import org.springframework.beans.factory.annotation.Value; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.stereotype.Component; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.SignatureAlgorithm; + +@Component +public class JWTUtil { + + //importando configurações que foram definidas lá no arquivo aplication.properties + @Value("${jwt.secret}") + private String secret; + + @Value("${jwt.expiration}") + private Long expiration; + + //método que gera o token + public String generateToken(Long id, String username, String name) { + UserTokenDTO user = new UserTokenDTO(id, username, name, ""); + Map extraClaims = new HashMap<>(); + extraClaims.put("username", username); + extraClaims.put("name", name); + extraClaims.put("sub", String.valueOf(id)); + return Jwts.builder().setSubject(String.valueOf(id)).setClaims(extraClaims).setExpiration(new Date(System.currentTimeMillis() + expiration)) + .signWith(SignatureAlgorithm.HS512, secret.getBytes()).compact(); + } + + public boolean tokenValido(String token) { + + Claims claims = getClaims(token); + if (claims != null) { + String username = (String) claims.get("username"); + Date expirationDate = claims.getExpiration(); + Date now = new Date(System.currentTimeMillis()); + if (username != null && expirationDate != null && now.before(expirationDate)) { + return true; + } + } + return false; + + } + + public String getUsername(String token) { + Claims claims = getClaims(token); + if (claims != null) { + return (String) claims.get("username"); + } + return null; + } + + private Claims getClaims(String token) { + try { + return Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token).getBody(); + } + catch (Exception e) { + return null; + } + } + +} diff --git a/backend/src/main/java/com/corelab/springboot/security/UserSS.java b/backend/src/main/java/com/corelab/springboot/security/UserSS.java new file mode 100755 index 0000000..a37766d --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/security/UserSS.java @@ -0,0 +1,78 @@ +package com.corelab.springboot.security; + +import java.util.Collection; + +import com.corelab.springboot.domain.enums.Authorize; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +public class UserSS implements UserDetails { + + private static final long serialVersionUID = 1L; + private Long id; + private String name; + private String username; + private String password; + private Collection authorities; + + public UserSS() { + } + + public UserSS(Long id, String username, String name, String password, Collection authorities) { + super(); + this.id = id; + this.username = username; + this.name = name; + this.password = password; + this.authorities = authorities; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + @Override + public Collection getAuthorities() { + return authorities; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + public boolean hasRole(Authorize authorize) { + return getAuthorities().contains(new SimpleGrantedAuthority(authorize.getDescription())); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/corelab/springboot/service/ConfigPathsService.java b/backend/src/main/java/com/corelab/springboot/service/ConfigPathsService.java new file mode 100644 index 0000000..168054c --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/service/ConfigPathsService.java @@ -0,0 +1,70 @@ +package com.corelab.springboot.service; + +import com.corelab.springboot.config.ConfigPaths; +import com.corelab.springboot.config.EnumHttpStatus; +import com.corelab.springboot.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ConfigPathsService { + private final UserRepository devDojoUserRepository; + + private static final String[] MATCHERS = { + "task", + "user", + }; + + public HttpMethod toExternalEnumHttpStatus(EnumHttpStatus httpStatus) { + switch (httpStatus) { + case POST: + return HttpMethod.POST; + case PUT: + return HttpMethod.PUT; + case GET: + return HttpMethod.GET; + case DELETE: + return HttpMethod.DELETE; + } + return null; + } + + public ConfigPaths mapperConfigMock(String path, EnumHttpStatus method){ + String role = path.toUpperCase() + "_" + method.toString(); + HttpMethod httpMethod = toExternalEnumHttpStatus(method); + + return ConfigPaths.builder() + .path("/" + path + "/**") + .method(httpMethod) + .role(role) + .build(); + } + public List generateMatchers() { + List list = new ArrayList<>(); + + for (String path : MATCHERS) { + for (EnumHttpStatus x : EnumHttpStatus.values()) { + list.add(mapperConfigMock(path, x)); + } + } + return list; + } + public List generateMatchers(String byPath) { + List list = new ArrayList<>(); + + for (String path : MATCHERS) { + if(!path.equals((byPath))) { + continue; + } + for (EnumHttpStatus x : EnumHttpStatus.values()) { + list.add(mapperConfigMock(path, x)); + } + } + return list; + } +} diff --git a/backend/src/main/java/com/corelab/springboot/service/TaskService.java b/backend/src/main/java/com/corelab/springboot/service/TaskService.java new file mode 100644 index 0000000..e216c64 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/service/TaskService.java @@ -0,0 +1,98 @@ +package com.corelab.springboot.service; + +import com.corelab.springboot.domain.Task; +import com.corelab.springboot.domain.User; +import com.corelab.springboot.dto.TaskListDTO; +import com.corelab.springboot.dto.TaskRequestDTO; +import com.corelab.springboot.dto.UserListDTO; +import com.corelab.springboot.exception.BadRequestException; +import com.corelab.springboot.repository.TaskRepository; +import com.corelab.springboot.security.UserSS; +import com.corelab.springboot.specification.TaskSpecification; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class TaskService { + + private final TaskRepository taskRepository; + private final ModelMapper modelMapper; + + public Page listAll(Long userId, String title, String detail, String color, Boolean favorite, Date startDate, Date endDate, Pageable pageable) { + Specification spec = TaskSpecification.filterByParams(userId, title, detail, color, favorite, startDate, endDate); + Page tasks = taskRepository.findAll(spec, pageable); + return tasks.map(task -> modelMapper.map(task, TaskListDTO.class)); + } + + public List listAllNonPageable() { + return taskRepository.findAll().stream().map(obj -> modelMapper.map(obj, TaskListDTO.class)).collect(Collectors.toList()); + } + + public Task findByIdOrThrowBadRequestException(long id) { + return taskRepository.findById(id) + .orElseThrow(() -> new BadRequestException("Task not Found")); + } + + public Task findByIdDTOOrThrowBadRequestException(long id) { + Task task = taskRepository.findById(id) + .orElseThrow(() -> new BadRequestException("Task not Found")); + return modelMapper.map(modelMapper.map(task, TaskListDTO.class), Task.class); + } + + @Transactional + public Task save(TaskRequestDTO taskDTO) { + Task task = modelMapper.map(taskDTO, Task.class); + if(task.getUser() == null) { + final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + UserSS user = ((UserSS) authentication.getPrincipal()); + task.setUser(new User(user.getId())); + } + if(task.getColor() == null) { + task.setColor("#FFF"); + } + return taskRepository.save(task); + } + + public void delete(long id) { + taskRepository.delete(findByIdOrThrowBadRequestException(id)); + } + + public void update(TaskRequestDTO taskDTO) { + Task task = modelMapper.map(taskDTO, Task.class); + Task savedTask = findByIdOrThrowBadRequestException(task.getId()); + task.setId(savedTask.getId()); + if (task.getTitle() == null) { + task.setTitle(savedTask.getTitle()); + } + if (task.getDetail() == null) { + task.setDetail(savedTask.getDetail()); + } + if (task.getColor() == null) { + task.setColor(savedTask.getColor()); + } + if (task.getUser() == null) { + task.setUser(savedTask.getUser()); + } + if (task.getFavorite() == null) { + task.setFavorite(savedTask.getFavorite()); + } + if (task.getDate() == null) { + task.setDate(savedTask.getDate()); + } + taskRepository.save(task); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/service/UserDetailsService.java b/backend/src/main/java/com/corelab/springboot/service/UserDetailsService.java new file mode 100644 index 0000000..4ce6e56 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/service/UserDetailsService.java @@ -0,0 +1,26 @@ +package com.corelab.springboot.service; + +import com.corelab.springboot.domain.User; +import com.corelab.springboot.exception.BadRequestException; +import com.corelab.springboot.repository.UserRepository; +import com.corelab.springboot.security.UserSS; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService { + + @Autowired + private UserRepository repo; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = repo.findByUsername(username); + return new UserSS(user.getId(), user.getUsername(), user.getName(), user.getPassword(), user.getAuthorities()); + } + +} diff --git a/backend/src/main/java/com/corelab/springboot/service/UserService.java b/backend/src/main/java/com/corelab/springboot/service/UserService.java new file mode 100644 index 0000000..4d8ca25 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/service/UserService.java @@ -0,0 +1,100 @@ +package com.corelab.springboot.service; + +import com.corelab.springboot.domain.User; +import com.corelab.springboot.dto.UserListDTO; +import com.corelab.springboot.dto.UserRequestDTO; +import com.corelab.springboot.exception.BadRequestException; +import com.corelab.springboot.repository.UserRepository; +import com.corelab.springboot.security.UserSS; +import com.corelab.springboot.specification.UserSpecification; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserRepository userRepository; + private final ModelMapper modelMapper; + private final BCryptPasswordEncoder pe; + + public Page listAll(String name, String username, Pageable pageable) { + Specification spec = UserSpecification.filterByParams(name, username); + Page page = userRepository.findAll(spec, pageable); + return page.map(obj -> modelMapper.map(obj, UserListDTO.class)); + } + + public List listAllNonPageable() { + return userRepository.findAll().stream().map(obj -> modelMapper.map(obj,UserListDTO.class)).collect(Collectors.toList()); + } + + public User findByIdOrThrowBadRequestException(long id) { + return userRepository.findById(id) + .orElseThrow(() -> new BadRequestException("User not Found")); + } + + public UserListDTO findByIdDTOOrThrowBadRequestException(long id) { + + checkPermissionMaster(new Long(id), "No permission to view full user"); + User user = userRepository.findById(id) + .orElseThrow(() -> new BadRequestException("User not Found")); + + return modelMapper.map(user, UserListDTO.class); + } + + @Transactional + public UserRequestDTO save(UserRequestDTO userDTO) { + User user = modelMapper.map(userDTO, User.class); + if(user.getPassword() == null) { + user.setPassword(user.getUsername()); + } + user.setPassword(pe.encode(user.getPassword())); + userRepository.save(user); + return userDTO; + } + + public void delete(long id) { + this.checkPermissionMaster(id, "No permission to edit user"); + User user = findByIdOrThrowBadRequestException(id); + userRepository.delete(user); + } + + public void update(UserRequestDTO userDTO) { + + User user = modelMapper.map(userDTO, User.class); + this.checkPermissionMaster(user.getId(), "No permission to delete user"); + + User savedUser = findByIdOrThrowBadRequestException(user.getId()); + + if(user.getPassword() == null) { + user.setPassword(savedUser.getPassword()); + } + else { + user.setPassword(pe.encode(user.getPassword())); + } + user.setId(savedUser.getId()); + + userRepository.save(user); + } + + private void checkPermissionMaster(Long id, String message) { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + UserSS userSS = (UserSS) auth.getPrincipal(); + if(!userSS.getId().equals(id) && auth.getAuthorities().stream().noneMatch(ga -> ga.getAuthority().equals("ROLE_USER_MASTER"))) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, message); + } + } +} diff --git a/backend/src/main/java/com/corelab/springboot/specification/TaskSpecification.java b/backend/src/main/java/com/corelab/springboot/specification/TaskSpecification.java new file mode 100644 index 0000000..a1d68df --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/specification/TaskSpecification.java @@ -0,0 +1,49 @@ +package com.corelab.springboot.specification; + +import com.corelab.springboot.domain.Task; +import org.springframework.data.jpa.domain.Specification; +import javax.persistence.criteria.Predicate; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class TaskSpecification { + public static Specification filterByParams(Long userId, String title, String detail, String color, Boolean favorite, Date startDate, Date endDate) { + return (root, query, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + + // Filtrar por userId + if (userId != null) { + predicates.add(criteriaBuilder.equal(root.get("user").get("id"), userId)); + } + + // Filtrar por título + if (title != null) { + predicates.add(criteriaBuilder.like(root.get("title"), "%" + title + "%")); + } + + // Filtrar por detalhe + if (detail != null) { + predicates.add(criteriaBuilder.like(root.get("detail"), "%" + detail + "%")); + } + + // Filtrar por cor + if (color != null) { + predicates.add(criteriaBuilder.equal(root.get("color"), color)); + } + + // Filtrar por favorito + if (favorite != null) { + predicates.add(criteriaBuilder.equal(root.get("favorite"), favorite)); + } + + // Filtrar por range de datas (se ambos os parâmetros estiverem presentes) + if (startDate != null && endDate != null) { + predicates.add(criteriaBuilder.between(root.get("date"), startDate, endDate)); + } + + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } +} + diff --git a/backend/src/main/java/com/corelab/springboot/specification/UserSpecification.java b/backend/src/main/java/com/corelab/springboot/specification/UserSpecification.java new file mode 100644 index 0000000..365c59b --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/specification/UserSpecification.java @@ -0,0 +1,29 @@ +package com.corelab.springboot.specification; + +import com.corelab.springboot.domain.User; +import org.springframework.data.jpa.domain.Specification; + +import javax.persistence.criteria.Predicate; +import java.util.ArrayList; +import java.util.List; + +public class UserSpecification { + public static Specification filterByParams(String name, String username) { + return (root, query, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + + // Filtrar por título + if (name != null) { + predicates.add(criteriaBuilder.like(root.get("name"), "%" + name + "%")); + } + + // Filtrar por detalhe + if (username != null) { + predicates.add(criteriaBuilder.like(root.get("username"), "%" + username + "%")); + } + + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } +} + diff --git a/backend/src/main/java/com/corelab/springboot/util/DateUtil.java b/backend/src/main/java/com/corelab/springboot/util/DateUtil.java new file mode 100644 index 0000000..62f8736 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/util/DateUtil.java @@ -0,0 +1,19 @@ +package com.corelab.springboot.util; + +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.util.Date; + +@Component +public class DateUtil { + + public Date getDate(Long timeStamp) { + if(timeStamp == null) { + return null; + } + Instant instant = Instant.ofEpochSecond(timeStamp); + + return Date.from(instant); + } +} diff --git a/backend/src/main/java/com/corelab/springboot/wrapper/PageableResponse.java b/backend/src/main/java/com/corelab/springboot/wrapper/PageableResponse.java new file mode 100644 index 0000000..b61ee90 --- /dev/null +++ b/backend/src/main/java/com/corelab/springboot/wrapper/PageableResponse.java @@ -0,0 +1,41 @@ +package com.corelab.springboot.wrapper; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonCreator.Mode; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; + +@Getter +@Setter +public class PageableResponse extends PageImpl { + private boolean first; + private boolean last; + private int totalPages; + private int numberOfElements; + + @JsonCreator(mode = Mode.PROPERTIES ) + public PageableResponse(@JsonProperty("content") List content, + @JsonProperty("number") int number, + @JsonProperty("size") int size, + @JsonProperty("totalElements") int totalElements, + @JsonProperty("last") boolean last, + @JsonProperty("first") boolean first, + @JsonProperty("totalPages") int totalPages, + @JsonProperty("numberOfElements") int numberOfElements, + @JsonProperty("pageable") JsonNode pageable, + @JsonProperty("sort") JsonNode sort) { + super(content, PageRequest.of(number, size), totalElements); + + this.last = last; + this.first = first; + this.totalPages = totalPages; + this.numberOfElements = numberOfElements; + + } +} \ No newline at end of file diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml new file mode 100644 index 0000000..29461b7 --- /dev/null +++ b/backend/src/main/resources/application.yml @@ -0,0 +1,29 @@ +server: + error: + include-stacktrace: on_param + +spring: + + datasource: + url: jdbc:mysql://localhost:3306/code_challenge?createDatabaseIfNotExist=true + username: root + password: root + jpa: + hibernate: + ddl-auto: update + +jwt: + secret: SequenciaDeCaracteresParaAssinarToken + expiration: 86400000 + +logging: + level: + org: + hibernate: + SQL: DEBUG + springframework: + web: DEBUG + filter: + CommonsRequestLoggingFilter: DEBUG + client: + RestTemplate: DEBUG \ No newline at end of file diff --git a/backend/src/test/java/com/corelab/springboot/SpringbootApplicationTests.java b/backend/src/test/java/com/corelab/springboot/SpringbootApplicationTests.java new file mode 100644 index 0000000..4a3879d --- /dev/null +++ b/backend/src/test/java/com/corelab/springboot/SpringbootApplicationTests.java @@ -0,0 +1,15 @@ +package com.corelab.springboot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureTestDatabase +class SpringbootApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/backend/src/test/java/com/corelab/springboot/config/ConfigRestTemplate.java b/backend/src/test/java/com/corelab/springboot/config/ConfigRestTemplate.java new file mode 100644 index 0000000..3780ebe --- /dev/null +++ b/backend/src/test/java/com/corelab/springboot/config/ConfigRestTemplate.java @@ -0,0 +1,74 @@ +package com.corelab.springboot.config; + +import com.corelab.springboot.domain.User; +import com.corelab.springboot.repository.UserRepository; +import com.corelab.springboot.security.JWTUtil; +import com.corelab.springboot.util.UserCreator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class ConfigRestTemplate { + + @Autowired + private JWTUtil jwtTokenService; + + @Autowired + private UserRepository userRepository; + + @Autowired + private BCryptPasswordEncoder pe; + + @Bean(name = "testRestTemplateWithRoles") + public TestRestTemplate testRestTemplateWithRolesCreator() { + + User user = UserCreator.createUserToBeUser(pe); + String token = jwtTokenService.generateToken(user.getId(), user.getUsername(), user.getName()); + + RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder() + .additionalInterceptors((request, body, execution) -> { + request.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + token); + request.getHeaders().add(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8"); + return execution.execute(request, body); + }); + + return new TestRestTemplate(restTemplateBuilder); + } + + @Bean(name = "testRestTemplateWithoutRoles") + public TestRestTemplate testRestTemplateWithoutRoles() { + + User user = UserCreator.createUserWithoutPermission(pe); + String token = jwtTokenService.generateToken(user.getId(), user.getUsername(), user.getName()); + + RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder() + .additionalInterceptors((request, body, execution) -> { + request.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + token); + return execution.execute(request, body); + }); + + return new TestRestTemplate(restTemplateBuilder); + } + + @Bean(name = "testRestTemplateWithoutMasterPermission") + public TestRestTemplate testRestTemplateWithoutMasterPermission() { + + User user = UserCreator.createUserWithoutMasterPermission(pe); + String token = jwtTokenService.generateToken(user.getId(), user.getUsername(), user.getName()); + + RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder() + .additionalInterceptors((request, body, execution) -> { + request.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + token); + return execution.execute(request, body); + }); + + return new TestRestTemplate(restTemplateBuilder); + } +} diff --git a/backend/src/test/java/com/corelab/springboot/integration/TaskControllerIT.java b/backend/src/test/java/com/corelab/springboot/integration/TaskControllerIT.java new file mode 100644 index 0000000..37f0fb8 --- /dev/null +++ b/backend/src/test/java/com/corelab/springboot/integration/TaskControllerIT.java @@ -0,0 +1,209 @@ +package com.corelab.springboot.integration; + +import com.corelab.springboot.domain.Task; +import com.corelab.springboot.domain.User; +import com.corelab.springboot.dto.TaskListDTO; +import com.corelab.springboot.dto.TaskRequestDTO; +import com.corelab.springboot.dto.UserRequestDTO; +import com.corelab.springboot.exception.BadRequestException; +import com.corelab.springboot.repository.TaskRepository; +import com.corelab.springboot.repository.UserRepository; +import com.corelab.springboot.security.JWTUtil; +import com.corelab.springboot.util.TaskCreator; +import com.corelab.springboot.util.UserCreator; +import com.corelab.springboot.wrapper.PageableResponse; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.web.util.DefaultUriBuilderFactory; + +import java.util.HashSet; +import java.util.List; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureTestDatabase +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +class TaskControllerIT { + @Autowired + private JWTUtil jwtTokenService; + + @Autowired + @Qualifier("testRestTemplateWithRoles") + private TestRestTemplate testRestTemplateWithRoles; + + @Autowired + @Qualifier("testRestTemplateWithoutRoles") + private TestRestTemplate testRestTemplateWithoutRoles; + + @Autowired + private TaskRepository taskRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private BCryptPasswordEncoder pe; + + @Autowired + private ModelMapper modelMapper; + + @LocalServerPort + private String port; + + @BeforeEach + public void setup() { + User user = UserCreator.createUserToBeUser(pe); + userRepository.saveAndFlush(user); + userRepository.saveAndFlush(UserCreator.createUserWithoutPermission(pe)); + testRestTemplateWithRoles.getRestTemplate().setUriTemplateHandler(new DefaultUriBuilderFactory("http://localhost:" + port)); + testRestTemplateWithoutRoles.getRestTemplate().setUriTemplateHandler(new DefaultUriBuilderFactory("http://localhost:" + port)); + } + + @Test + @DisplayName("list returns list of task inside page object when successful") + void list_ReturnsListOfTasksInsidePageObject_WhenSuccessful() { + User user = new User(1L); + Task savedTask = taskRepository.save(TaskCreator.createTaskToBeSaved(user)); + + String expectedName = savedTask.getTitle(); + + PageableResponse taskPage = testRestTemplateWithRoles.exchange("/task", HttpMethod.GET, null, + new ParameterizedTypeReference>() { + }).getBody(); + + Assertions.assertThat(taskPage).isNotNull(); + + Assertions.assertThat(taskPage.toList()) + .isNotEmpty() + .hasSize(5); + + Assertions.assertThat(taskPage.toList().get(0).getTitle()).isEqualTo(expectedName); + } + + @Test + @DisplayName("listAll returns list of task when successful") + void listAll_ReturnsListOfTasks_WhenSuccessful() { + User user = new User(1L); + Task savedTask = taskRepository.save(TaskCreator.createTaskToBeSaved(user)); + + String expectedName = savedTask.getTitle(); + + List task = testRestTemplateWithRoles.exchange("/task/all", HttpMethod.GET, null, + new ParameterizedTypeReference>() { + }).getBody(); + + Assertions.assertThat(task) + .isNotNull() + .isNotEmpty() + .hasSize(21); + + Assertions.assertThat(task.get(0).getTitle()).isEqualTo(expectedName); + } + + @Test + @DisplayName("findById returns task when successful") + void findById_ReturnsTask_WhenSuccessful() { + User user = new User(1L); + Task savedTask = taskRepository.save(TaskCreator.createTaskToBeSaved(user)); + + Long expectedId = savedTask.getId(); + + Task task = testRestTemplateWithRoles.getForObject("/task/{id}", Task.class, expectedId); + + Assertions.assertThat(task).isNotNull(); + + Assertions.assertThat(task.getId()).isNotNull().isEqualTo(expectedId); + } + + @Test + @DisplayName("save returns task when successful") + void save_ReturnsTask_WhenSuccessful() { + User user = userRepository.findById(1L).orElseThrow(() -> new BadRequestException("User not Found")); + + Task taskPostRequestBody = TaskCreator.createTaskToBeSaved(user); + taskPostRequestBody.setUser(null); + taskPostRequestBody.setId(null); + TaskRequestDTO taskRequestDTO = modelMapper.map(taskPostRequestBody, TaskRequestDTO.class); + + ResponseEntity taskResponseEntity = testRestTemplateWithRoles.postForEntity("/task", taskRequestDTO, TaskRequestDTO.class); + + Assertions.assertThat(taskResponseEntity).isNotNull(); + Assertions.assertThat(taskResponseEntity.getStatusCode()).isEqualTo(HttpStatus.CREATED); + Assertions.assertThat(taskResponseEntity.getBody()).isNotNull(); + Assertions.assertThat(taskResponseEntity.getBody().getId()).isNotNull(); + + } + + @Test + @DisplayName("replace updates task when successful") + void replace_UpdatesTask_WhenSuccessful() { + User user = new User(1L); + Task savedTask = taskRepository.save(TaskCreator.createTaskToBeSaved(user)); + + Task updatedTask = TaskCreator.createTaskToBeUpdated(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity<>(updatedTask, headers); + ResponseEntity taskResponseEntity = testRestTemplateWithRoles.exchange("/task/{id}", + HttpMethod.PUT, requestEntity, Void.class, savedTask.getId()); + + Task task = taskRepository.findById(savedTask.getId()) + .orElseThrow(() -> new BadRequestException("Task not Found"));; + + Assertions.assertThat(task.getTitle()).isEqualTo(savedTask.getTitle()); + Assertions.assertThat(taskResponseEntity).isNotNull(); + + Assertions.assertThat(taskResponseEntity.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + } + + @Test + @DisplayName("delete removes task when successful") + void delete_RemovesTask_WhenSuccessful() { + User user = new User(1L); + Task savedTask = taskRepository.save(TaskCreator.createTaskToBeSaved(user)); + + ResponseEntity taskResponseEntity = testRestTemplateWithRoles.exchange("/task/{id}", + HttpMethod.DELETE, null, Void.class, savedTask.getId()); + + Assertions.assertThat(taskResponseEntity).isNotNull(); + + Assertions.assertThat(taskResponseEntity.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + } + @Test + @DisplayName("delete returns 403 when task is not admin") + void delete_Returns403_WhenTaskIsNotAdmin() { + User user = userRepository.findById(2L).orElseThrow(() -> new BadRequestException("User not Found")); + user.setTasks(new HashSet<>()); + + UserRequestDTO userRequestDTO = modelMapper.map(user, UserRequestDTO.class); + userRequestDTO.setAuthorities("1,2,3"); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity<>(userRequestDTO, headers); + testRestTemplateWithRoles.exchange("/user/{id}", + HttpMethod.PUT, requestEntity, Void.class, user.getId()); + + Task savedTask = taskRepository.save(TaskCreator.createTaskToBeSaved(user)); + + ResponseEntity taskResponseEntity = testRestTemplateWithoutRoles.exchange("/task/{id}", + HttpMethod.DELETE, null, Void.class, savedTask.getId()); + + Assertions.assertThat(taskResponseEntity).isNotNull(); + + Assertions.assertThat(taskResponseEntity.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN); + } + +} diff --git a/backend/src/test/java/com/corelab/springboot/integration/UserControllerIT.java b/backend/src/test/java/com/corelab/springboot/integration/UserControllerIT.java new file mode 100644 index 0000000..79af670 --- /dev/null +++ b/backend/src/test/java/com/corelab/springboot/integration/UserControllerIT.java @@ -0,0 +1,217 @@ +package com.corelab.springboot.integration; + +import com.corelab.springboot.domain.User; +import com.corelab.springboot.dto.UserListDTO; +import com.corelab.springboot.dto.UserRequestDTO; +import com.corelab.springboot.exception.BadRequestException; +import com.corelab.springboot.repository.UserRepository; +import com.corelab.springboot.security.JWTUtil; +import com.corelab.springboot.util.UserCreator; +import com.corelab.springboot.wrapper.PageableResponse; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.web.util.DefaultUriBuilderFactory; + +import java.util.HashSet; +import java.util.List; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureTestDatabase +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +class UserControllerIT { + @Autowired + private JWTUtil jwtTokenService; + + @Autowired + @Qualifier("testRestTemplateWithRoles") + private TestRestTemplate testRestTemplateWithRoles; + + @Autowired + @Qualifier("testRestTemplateWithoutRoles") + private TestRestTemplate testRestTemplateWithoutRoles; + + @Autowired + @Qualifier("testRestTemplateWithoutMasterPermission") + private TestRestTemplate testRestTemplateWithoutMasterPermission; + + @Autowired + private UserRepository userRepository; + + @Autowired + private BCryptPasswordEncoder pe; + + @Autowired + private ModelMapper modelMapper; + + @LocalServerPort + private String port; + + @BeforeEach + public void setup() { + User user = UserCreator.createUserToBeUser(pe); + userRepository.saveAndFlush(user); + userRepository.saveAndFlush(UserCreator.createUserWithoutPermission(pe)); + userRepository.saveAndFlush(UserCreator.createUserWithoutMasterPermission(pe)); + testRestTemplateWithRoles.getRestTemplate().setUriTemplateHandler(new DefaultUriBuilderFactory("http://localhost:" + port)); + testRestTemplateWithoutRoles.getRestTemplate().setUriTemplateHandler(new DefaultUriBuilderFactory("http://localhost:" + port)); + testRestTemplateWithoutMasterPermission.getRestTemplate().setUriTemplateHandler(new DefaultUriBuilderFactory("http://localhost:" + port)); + } + + @Test + @DisplayName("list returns list of user inside page object when successful") + void list_ReturnsListOfUsersInsidePageObject_WhenSuccessful() { + User savedUser = userRepository.save(UserCreator.createUserToBeSaved(pe)); + + String expectedName = savedUser.getName(); + + PageableResponse userPage = testRestTemplateWithRoles.exchange("/user", HttpMethod.GET, null, + new ParameterizedTypeReference>() { + }).getBody(); + + Assertions.assertThat(userPage).isNotNull(); + + Assertions.assertThat(userPage.toList()) + .isNotEmpty() + .hasSize(4); + + Assertions.assertThat(userPage.toList().get(3).getName()).isEqualTo(expectedName); + } + + @Test + @DisplayName("listAll returns list of user when successful") + void listAll_ReturnsListOfUsers_WhenSuccessful() { + User savedUser = userRepository.save(UserCreator.createUserToBeSaved(pe)); + + String expectedName = savedUser.getName(); + + List user = testRestTemplateWithRoles.exchange("/user/all", HttpMethod.GET, null, + new ParameterizedTypeReference>() { + }).getBody(); + + Assertions.assertThat(user) + .isNotNull() + .isNotEmpty() + .hasSize(4); + + Assertions.assertThat(user.get(3).getName()).isEqualTo(expectedName); + } + + @Test + @DisplayName("findById returns user when successful") + void findById_ReturnsUser_WhenSuccessful() { + User savedUser = userRepository.save(UserCreator.createUserToBeSaved(pe)); + + Long expectedId = savedUser.getId(); + + User user = testRestTemplateWithRoles.getForObject("/user/{id}", User.class, expectedId); + + Assertions.assertThat(user).isNotNull(); + + Assertions.assertThat(user.getId()).isNotNull().isEqualTo(expectedId); + } + + @Test + @DisplayName("save returns user when successful") + void save_ReturnsUser_WhenSuccessful() { + + User userPostRequestBody = UserCreator.createUserToBeSaved(pe); + UserRequestDTO userRequestDTO = modelMapper.map(userPostRequestBody, UserRequestDTO.class); + + ResponseEntity userResponseEntity = testRestTemplateWithRoles.postForEntity("/user", userRequestDTO, UserRequestDTO.class); + + Assertions.assertThat(userResponseEntity).isNotNull(); + Assertions.assertThat(userResponseEntity.getStatusCode()).isEqualTo(HttpStatus.CREATED); + Assertions.assertThat(userResponseEntity.getBody()).isNotNull(); + Assertions.assertThat(userResponseEntity.getBody().getId()).isNotNull(); + + } + + @Test + @DisplayName("replace updates user when successful") + void replace_UpdatesUser_WhenSuccessful() { + User savedUser = userRepository.save(UserCreator.createUserToBeSaved(pe)); + + UserRequestDTO newUser = UserRequestDTO.builder() + .username("marcos") + .name("new name") + .authorities("1,2,3") + .tasks(new HashSet<>()) + .build(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity<>(newUser, headers); + ResponseEntity userResponseEntity = testRestTemplateWithRoles.exchange("/user/{id}", + HttpMethod.PUT, requestEntity, Void.class, savedUser.getId()); + + User user = userRepository.findById(savedUser.getId()) + .orElseThrow(() -> new BadRequestException("User not Found"));; + + Assertions.assertThat(user.getName()).isEqualTo(newUser.getName()); + Assertions.assertThat(userResponseEntity).isNotNull(); + + Assertions.assertThat(userResponseEntity.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + } + + @Test + @DisplayName("delete removes user when successful") + void delete_RemovesUser_WhenSuccessful() { + User savedUser = userRepository.save(UserCreator.createUserToBeSaved(pe)); + + ResponseEntity userResponseEntity = testRestTemplateWithRoles.exchange("/user/{id}", + HttpMethod.DELETE, null, Void.class, savedUser.getId()); + + Assertions.assertThat(userResponseEntity).isNotNull(); + + Assertions.assertThat(userResponseEntity.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + } + @Test + @DisplayName("delete returns 403 when user is not admin") + void delete_Returns403_WhenUserIsNotAdmin() { + User savedUser = userRepository.save(UserCreator.createUserToBeSaved(pe)); + + ResponseEntity userResponseEntity = testRestTemplateWithoutRoles.exchange("/user/{id}", + HttpMethod.DELETE, null, Void.class, savedUser.getId()); + + Assertions.assertThat(userResponseEntity).isNotNull(); + + Assertions.assertThat(userResponseEntity.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN); + } + + @Test + @DisplayName("replace returns 403 when user is not the same user logged in") + void replace_Returns403_WhenUserIsNotTheSameUserLoggedIn() { + User savedUser = userRepository.save(UserCreator.createUserToBeSaved(pe)); + + UserRequestDTO newUser = UserRequestDTO.builder() + .username("marcos") + .name("new name") + .authorities("1,2,3") + .tasks(new HashSet<>()) + .build(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity<>(newUser, headers); + ResponseEntity userResponseEntity = testRestTemplateWithoutMasterPermission.exchange("/user/{id}", + HttpMethod.PUT, requestEntity, Void.class, savedUser.getId()); + + Assertions.assertThat(userResponseEntity).isNotNull(); + + Assertions.assertThat(userResponseEntity.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN); + } + +} diff --git a/backend/src/test/java/com/corelab/springboot/util/TaskCreator.java b/backend/src/test/java/com/corelab/springboot/util/TaskCreator.java new file mode 100644 index 0000000..371533b --- /dev/null +++ b/backend/src/test/java/com/corelab/springboot/util/TaskCreator.java @@ -0,0 +1,31 @@ +package com.corelab.springboot.util; + +import com.corelab.springboot.domain.Task; +import com.corelab.springboot.domain.User; + +import java.util.Date; + +public class TaskCreator { + + public static Task createTaskToBeSaved(User user){ + return Task.builder() + .title("Anotação 1") + .detail("tenha atenção") + .color("#FFF") + .favorite(true) + .user(user) + .date(new Date()) + .id(1L) + .build(); + } + + public static Task createTaskToBeUpdated(){ + return Task.builder() + .title("Anotação 1") + .detail("Tenha atenção, pois isso é muito importante") + .favorite(true) + .id(1L) + .build(); + } + +} diff --git a/backend/src/test/java/com/corelab/springboot/util/UserCreator.java b/backend/src/test/java/com/corelab/springboot/util/UserCreator.java new file mode 100644 index 0000000..1f6e432 --- /dev/null +++ b/backend/src/test/java/com/corelab/springboot/util/UserCreator.java @@ -0,0 +1,49 @@ +package com.corelab.springboot.util; + +import com.corelab.springboot.domain.User; +import com.corelab.springboot.domain.User; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +public class UserCreator { + + public static User createUserToBeSaved(BCryptPasswordEncoder pe){ + return User.builder() + .username("marcos") + .name("Marcos") + .authorities("1,2,3,4,5,6") + .password(pe.encode("1234")) + .id(4L) + .build(); + } + + public static User createUserToBeUser(BCryptPasswordEncoder pe){ + return User.builder() + .username("lane") + .name("Lane") + .authorities("1,2,3,4,5,6,7,8,9") + .password(pe.encode("1234")) + .id(1L) + .build(); + } + + public static User createUserWithoutPermission(BCryptPasswordEncoder pe){ + return User.builder() + .username("tiago") + .name("Tiago") + .authorities("5,6,7,8,9") + .password(pe.encode("1234")) + .id(2L) + .build(); + } + + public static User createUserWithoutMasterPermission(BCryptPasswordEncoder pe){ + return User.builder() + .username("nei") + .name("Claudinei") + .authorities("1,2,3,4,5,6,7,8") + .password(pe.encode("1234")) + .id(3L) + .build(); + } + +} diff --git a/backend/src/test/resources/logback-test.xml b/backend/src/test/resources/logback-test.xml new file mode 100644 index 0000000..4bd2e37 --- /dev/null +++ b/backend/src/test/resources/logback-test.xml @@ -0,0 +1,11 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..99a97e2 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,54 @@ +# These are some examples of commonly ignored file patterns. +# You should customize this list as applicable to your project. +# Learn more about .gitignore: +# https://www.atlassian.com/git/tutorials/saving-changes/gitignore + +# Node artifact files +node_modules/ +dist/ + +# Compiled Java class files +*.class + +# Compiled Python bytecode +*.py[cod] + +# Log files +*.log + +# Package files +*.jar + +# Maven +target/ +dist/ + +# JetBrains IDE +.idea/ + +# Unit test reports +TEST*.xml + +# Generated by MacOS +.DS_Store + +# Generated by Windows +Thumbs.db + +# Applications +*.app +*.exe +*.war + +# Large media files +*.mp4 +*.tiff +*.avi +*.flv +*.mov +*.wmv + + +# *.lock + +build/ diff --git a/frontend/.prettierrc.js b/frontend/.prettierrc.js new file mode 100644 index 0000000..e40f408 --- /dev/null +++ b/frontend/.prettierrc.js @@ -0,0 +1,10 @@ +module.exports = { + bracketSpacing: true, + jsxBracketSameLine: true, + singleQuote: true, + semi: true, + trailingComma: 'all', + endOfLine: 'auto', + arrowParens: 'avoid', + tabWidth: 4, +}; diff --git a/frontend/.vscode/launch.json b/frontend/.vscode/launch.json new file mode 100644 index 0000000..b513da3 --- /dev/null +++ b/frontend/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:3000/", + "webRoot": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..b87cb00 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,46 @@ +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.\ +You will also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/frontend/municipios.json b/frontend/municipios.json new file mode 100644 index 0000000..07a6f7d --- /dev/null +++ b/frontend/municipios.json @@ -0,0 +1 @@ +[{"id":"4200051","nome":"Abdon Batista","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200101","nome":"Abelardo Luz","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200200","nome":"Agrolândia","microrregiao":{"id":42014,"nome":"Ituporanga","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200309","nome":"Agronômica","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200408","nome":"Água Doce","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200507","nome":"Águas de Chapecó","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200556","nome":"Águas Frias","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200606","nome":"Águas Mornas","microrregiao":{"id":42017,"nome":"Tabuleiro","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200705","nome":"Alfredo Wagner","microrregiao":{"id":42017,"nome":"Tabuleiro","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200754","nome":"Alto Bela Vista","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200804","nome":"Anchieta","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4200903","nome":"Angelina","microrregiao":{"id":42015,"nome":"Tijucas","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201000","nome":"Anita Garibaldi","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201109","nome":"Anitápolis","microrregiao":{"id":42017,"nome":"Tabuleiro","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201208","nome":"Antônio Carlos","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201257","nome":"Apiúna","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201273","nome":"Arabutã","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201307","nome":"Araquari","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201406","nome":"Araranguá","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201505","nome":"Armazém","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201604","nome":"Arroio Trinta","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201653","nome":"Arvoredo","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201703","nome":"Ascurra","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201802","nome":"Atalanta","microrregiao":{"id":42014,"nome":"Ituporanga","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201901","nome":"Aurora","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4201950","nome":"Balneário Arroio do Silva","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202008","nome":"Balneário Camboriú","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202057","nome":"Balneário Barra do Sul","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202073","nome":"Balneário Gaivota","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202081","nome":"Bandeirante","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202099","nome":"Barra Bonita","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202107","nome":"Barra Velha","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202131","nome":"Bela Vista do Toldo","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202156","nome":"Belmonte","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202206","nome":"Benedito Novo","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202305","nome":"Biguaçu","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202404","nome":"Blumenau","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202438","nome":"Bocaina do Sul","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202453","nome":"Bombinhas","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202503","nome":"Bom Jardim da Serra","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202537","nome":"Bom Jesus","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202578","nome":"Bom Jesus do Oeste","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420012,"nome":"Maravilha","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202602","nome":"Bom Retiro","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202701","nome":"Botuverá","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420021,"nome":"Brusque","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202800","nome":"Braço do Norte","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202859","nome":"Braço do Trombudo","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202875","nome":"Brunópolis","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420006,"nome":"Curitibanos","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4202909","nome":"Brusque","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420021,"nome":"Brusque","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203006","nome":"Caçador","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420014,"nome":"Caçador","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203105","nome":"Caibi","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203154","nome":"Calmon","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420014,"nome":"Caçador","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203204","nome":"Camboriú","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203253","nome":"Capão Alto","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203303","nome":"Campo Alegre","microrregiao":{"id":42007,"nome":"São Bento do Sul","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420018,"nome":"São Bento do Sul - Rio Negrinho","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203402","nome":"Campo Belo do Sul","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203501","nome":"Campo Erê","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420013,"nome":"São Lourenço do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203600","nome":"Campos Novos","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203709","nome":"Canelinha","microrregiao":{"id":42015,"nome":"Tijucas","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420021,"nome":"Brusque","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203808","nome":"Canoinhas","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203907","nome":"Capinzal","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4203956","nome":"Capivari de Baixo","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204004","nome":"Catanduvas","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204103","nome":"Caxambu do Sul","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204152","nome":"Celso Ramos","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204178","nome":"Cerro Negro","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204194","nome":"Chapadão do Lageado","microrregiao":{"id":42014,"nome":"Ituporanga","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420024,"nome":"Ituporanga","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204202","nome":"Chapecó","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204251","nome":"Cocal do Sul","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204301","nome":"Concórdia","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204350","nome":"Cordilheira Alta","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204400","nome":"Coronel Freitas","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204459","nome":"Coronel Martins","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204509","nome":"Corupá","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204558","nome":"Correia Pinto","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204608","nome":"Criciúma","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204707","nome":"Cunha Porã","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420012,"nome":"Maravilha","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204756","nome":"Cunhataí","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204806","nome":"Curitibanos","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420006,"nome":"Curitibanos","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4204905","nome":"Descanso","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205001","nome":"Dionísio Cerqueira","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205100","nome":"Dona Emma","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420023,"nome":"Ibirama - Presidente Getúlio","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205159","nome":"Doutor Pedrinho","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205175","nome":"Entre Rios","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205191","nome":"Ermo","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205209","nome":"Erval Velho","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205308","nome":"Faxinal dos Guedes","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205357","nome":"Flor do Sertão","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205407","nome":"Florianópolis","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205431","nome":"Formosa do Sul","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205456","nome":"Forquilhinha","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205506","nome":"Fraiburgo","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205555","nome":"Frei Rogério","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420006,"nome":"Curitibanos","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205605","nome":"Galvão","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420013,"nome":"São Lourenço do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205704","nome":"Garopaba","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205803","nome":"Garuva","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4205902","nome":"Gaspar","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206009","nome":"Governador Celso Ramos","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206108","nome":"Grão-Pará","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206207","nome":"Gravatal","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206306","nome":"Guabiruba","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420021,"nome":"Brusque","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206405","nome":"Guaraciaba","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206504","nome":"Guaramirim","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206603","nome":"Guarujá do Sul","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206652","nome":"Guatambú","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206702","nome":"Herval d'Oeste","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206751","nome":"Ibiam","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206801","nome":"Ibicaré","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4206900","nome":"Ibirama","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420023,"nome":"Ibirama - Presidente Getúlio","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207007","nome":"Içara","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207106","nome":"Ilhota","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207205","nome":"Imaruí","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207304","nome":"Imbituba","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207403","nome":"Imbuia","microrregiao":{"id":42014,"nome":"Ituporanga","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420024,"nome":"Ituporanga","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207502","nome":"Indaial","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207577","nome":"Iomerê","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207601","nome":"Ipira","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207650","nome":"Iporã do Oeste","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207684","nome":"Ipuaçu","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207700","nome":"Ipumirim","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207759","nome":"Iraceminha","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420012,"nome":"Maravilha","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207809","nome":"Irani","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207858","nome":"Irati","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4207908","nome":"Irineópolis","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208005","nome":"Itá","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208104","nome":"Itaiópolis","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208203","nome":"Itajaí","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208302","nome":"Itapema","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208401","nome":"Itapiranga","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208450","nome":"Itapoá","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208500","nome":"Ituporanga","microrregiao":{"id":42014,"nome":"Ituporanga","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420024,"nome":"Ituporanga","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208609","nome":"Jaborá","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208708","nome":"Jacinto Machado","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208807","nome":"Jaguaruna","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208906","nome":"Jaraguá do Sul","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4208955","nome":"Jardinópolis","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209003","nome":"Joaçaba","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209102","nome":"Joinville","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209151","nome":"José Boiteux","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420023,"nome":"Ibirama - Presidente Getúlio","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209177","nome":"Jupiá","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420013,"nome":"São Lourenço do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209201","nome":"Lacerdópolis","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209300","nome":"Lages","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209409","nome":"Laguna","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209458","nome":"Lajeado Grande","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209508","nome":"Laurentino","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209607","nome":"Lauro Müller","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209706","nome":"Lebon Régis","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420014,"nome":"Caçador","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209805","nome":"Leoberto Leal","microrregiao":{"id":42015,"nome":"Tijucas","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420024,"nome":"Ituporanga","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209854","nome":"Lindóia do Sul","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4209904","nome":"Lontras","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210001","nome":"Luiz Alves","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210035","nome":"Luzerna","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210050","nome":"Macieira","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420014,"nome":"Caçador","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210100","nome":"Mafra","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210209","nome":"Major Gercino","microrregiao":{"id":42015,"nome":"Tijucas","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420021,"nome":"Brusque","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210308","nome":"Major Vieira","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210407","nome":"Maracajá","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210506","nome":"Maravilha","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420012,"nome":"Maravilha","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210555","nome":"Marema","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210605","nome":"Massaranduba","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210704","nome":"Matos Costa","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420014,"nome":"Caçador","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210803","nome":"Meleiro","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210852","nome":"Mirim Doce","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4210902","nome":"Modelo","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211009","nome":"Mondaí","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211058","nome":"Monte Carlo","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211108","nome":"Monte Castelo","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211207","nome":"Morro da Fumaça","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211256","nome":"Morro Grande","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211306","nome":"Navegantes","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211405","nome":"Nova Erechim","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211454","nome":"Nova Itaberaba","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211504","nome":"Nova Trento","microrregiao":{"id":42015,"nome":"Tijucas","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420021,"nome":"Brusque","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211603","nome":"Nova Veneza","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211652","nome":"Novo Horizonte","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420013,"nome":"São Lourenço do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211702","nome":"Orleans","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211751","nome":"Otacílio Costa","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211801","nome":"Ouro","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211850","nome":"Ouro Verde","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211876","nome":"Paial","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211892","nome":"Painel","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4211900","nome":"Palhoça","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212007","nome":"Palma Sola","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212056","nome":"Palmeira","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212106","nome":"Palmitos","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212205","nome":"Papanduva","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212239","nome":"Paraíso","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212254","nome":"Passo de Torres","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212270","nome":"Passos Maia","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212304","nome":"Paulo Lopes","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212403","nome":"Pedras Grandes","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212502","nome":"Penha","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212601","nome":"Peritiba","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212650","nome":"Pescaria Brava","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212700","nome":"Petrolândia","microrregiao":{"id":42014,"nome":"Ituporanga","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420024,"nome":"Ituporanga","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212809","nome":"Balneário Piçarras","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4212908","nome":"Pinhalzinho","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213005","nome":"Pinheiro Preto","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213104","nome":"Piratuba","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213153","nome":"Planalto Alegre","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213203","nome":"Pomerode","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213302","nome":"Ponte Alta","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213351","nome":"Ponte Alta do Norte","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420006,"nome":"Curitibanos","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213401","nome":"Ponte Serrada","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213500","nome":"Porto Belo","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213609","nome":"Porto União","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213708","nome":"Pouso Redondo","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213807","nome":"Praia Grande","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4213906","nome":"Presidente Castello Branco","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214003","nome":"Presidente Getúlio","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420023,"nome":"Ibirama - Presidente Getúlio","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214102","nome":"Presidente Nereu","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214151","nome":"Princesa","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214201","nome":"Quilombo","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214300","nome":"Rancho Queimado","microrregiao":{"id":42017,"nome":"Tabuleiro","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214409","nome":"Rio das Antas","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214508","nome":"Rio do Campo","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214607","nome":"Rio do Oeste","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214706","nome":"Rio dos Cedros","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214805","nome":"Rio do Sul","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4214904","nome":"Rio Fortuna","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215000","nome":"Rio Negrinho","microrregiao":{"id":42007,"nome":"São Bento do Sul","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420018,"nome":"São Bento do Sul - Rio Negrinho","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215059","nome":"Rio Rufino","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215075","nome":"Riqueza","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215109","nome":"Rodeio","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215208","nome":"Romelândia","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215307","nome":"Salete","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215356","nome":"Saltinho","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420012,"nome":"Maravilha","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215406","nome":"Salto Veloso","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215455","nome":"Sangão","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215505","nome":"Santa Cecília","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420006,"nome":"Curitibanos","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215554","nome":"Santa Helena","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215604","nome":"Santa Rosa de Lima","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215653","nome":"Santa Rosa do Sul","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215679","nome":"Santa Terezinha","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215687","nome":"Santa Terezinha do Progresso","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420012,"nome":"Maravilha","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215695","nome":"Santiago do Sul","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215703","nome":"Santo Amaro da Imperatriz","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215752","nome":"São Bernardino","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420013,"nome":"São Lourenço do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215802","nome":"São Bento do Sul","microrregiao":{"id":42007,"nome":"São Bento do Sul","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420018,"nome":"São Bento do Sul - Rio Negrinho","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4215901","nome":"São Bonifácio","microrregiao":{"id":42017,"nome":"Tabuleiro","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216008","nome":"São Carlos","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216057","nome":"São Cristóvão do Sul","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420006,"nome":"Curitibanos","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216107","nome":"São Domingos","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216206","nome":"São Francisco do Sul","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216255","nome":"São João do Oeste","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216305","nome":"São João Batista","microrregiao":{"id":42015,"nome":"Tijucas","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420021,"nome":"Brusque","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216354","nome":"São João do Itaperiú","microrregiao":{"id":42013,"nome":"Itajaí","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216404","nome":"São João do Sul","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216503","nome":"São Joaquim","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216602","nome":"São José","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216701","nome":"São José do Cedro","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216800","nome":"São José do Cerrito","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4216909","nome":"São Lourenço do Oeste","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420013,"nome":"São Lourenço do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217006","nome":"São Ludgero","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217105","nome":"São Martinho","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217154","nome":"São Miguel da Boa Vista","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420012,"nome":"Maravilha","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217204","nome":"São Miguel do Oeste","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217253","nome":"São Pedro de Alcântara","microrregiao":{"id":42016,"nome":"Florianópolis","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420001,"nome":"Florianópolis","regiao-intermediaria":{"id":4201,"nome":"Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217303","nome":"Saudades","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217402","nome":"Schroeder","microrregiao":{"id":42008,"nome":"Joinville","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420016,"nome":"Joinville","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217501","nome":"Seara","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420010,"nome":"Concórdia","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217550","nome":"Serra Alta","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217600","nome":"Siderópolis","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217709","nome":"Sombrio","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217758","nome":"Sul Brasil","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217808","nome":"Taió","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217907","nome":"Tangará","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4217956","nome":"Tigrinhos","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420012,"nome":"Maravilha","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218004","nome":"Tijucas","microrregiao":{"id":42015,"nome":"Tijucas","mesorregiao":{"id":4205,"nome":"Grande Florianópolis","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420020,"nome":"Itajaí","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218103","nome":"Timbé do Sul","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218202","nome":"Timbó","microrregiao":{"id":42012,"nome":"Blumenau","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420019,"nome":"Blumenau","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218251","nome":"Timbó Grande","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420014,"nome":"Caçador","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218301","nome":"Três Barras","microrregiao":{"id":42006,"nome":"Canoinhas","mesorregiao":{"id":4202,"nome":"Norte Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420017,"nome":"Mafra","regiao-intermediaria":{"id":4206,"nome":"Joinville","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218350","nome":"Treviso","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218400","nome":"Treze de Maio","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218509","nome":"Treze Tílias","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218608","nome":"Trombudo Central","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420022,"nome":"Rio do Sul","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218707","nome":"Tubarão","microrregiao":{"id":42018,"nome":"Tubarão","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420003,"nome":"Tubarão","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218756","nome":"Tunápolis","microrregiao":{"id":42001,"nome":"São Miguel do Oeste","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420009,"nome":"São Miguel do Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218806","nome":"Turvo","microrregiao":{"id":42020,"nome":"Araranguá","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420004,"nome":"Araranguá","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218855","nome":"União do Oeste","microrregiao":{"id":42002,"nome":"Chapecó","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218905","nome":"Urubici","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4218954","nome":"Urupema","microrregiao":{"id":42010,"nome":"Campos de Lages","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420005,"nome":"Lages","regiao-intermediaria":{"id":4203,"nome":"Lages","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219002","nome":"Urussanga","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219101","nome":"Vargeão","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219150","nome":"Vargem","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219176","nome":"Vargem Bonita","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219200","nome":"Vidal Ramos","microrregiao":{"id":42014,"nome":"Ituporanga","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420024,"nome":"Ituporanga","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219309","nome":"Videira","microrregiao":{"id":42004,"nome":"Joaçaba","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420015,"nome":"Videira","regiao-intermediaria":{"id":4205,"nome":"Caçador","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219358","nome":"Vitor Meireles","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420023,"nome":"Ibirama - Presidente Getúlio","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219408","nome":"Witmarsum","microrregiao":{"id":42011,"nome":"Rio do Sul","mesorregiao":{"id":4204,"nome":"Vale do Itajaí","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420023,"nome":"Ibirama - Presidente Getúlio","regiao-intermediaria":{"id":4207,"nome":"Blumenau","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219507","nome":"Xanxerê","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219606","nome":"Xavantina","microrregiao":{"id":42005,"nome":"Concórdia","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420011,"nome":"Xanxerê","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219705","nome":"Xaxim","microrregiao":{"id":42003,"nome":"Xanxerê","mesorregiao":{"id":4201,"nome":"Oeste Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420007,"nome":"Chapecó","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4219853","nome":"Zortéa","microrregiao":{"id":42009,"nome":"Curitibanos","mesorregiao":{"id":4203,"nome":"Serrana","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420008,"nome":"Joaçaba - Herval d'Oeste","regiao-intermediaria":{"id":4204,"nome":"Chapecó","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}},{"id":"4220000","nome":"Balneário Rincão","microrregiao":{"id":42019,"nome":"Criciúma","mesorregiao":{"id":4206,"nome":"Sul Catarinense","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}},"regiao-imediata":{"id":420002,"nome":"Criciúma","regiao-intermediaria":{"id":4202,"nome":"Criciúma","UF":{"id":42,"sigla":"SC","nome":"Santa Catarina","regiao":{"id":4,"sigla":"S","nome":"Sul"}}}}}] \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..ae5ba6e --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,93 @@ +{ + "name": "frontend-gestao", + "version": "0.1.0", + "private": true, + "dependencies": { + "@amcharts/amcharts5": "^5.2.26", + "@date-io/date-fns": "^2.13.1", + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/icons-material": "^5.6.2", + "@mui/material": "^5.6.2", + "@mui/styles": "^5.6.2", + "@mui/x-data-grid": "^5.9.0", + "@mui/x-date-pickers": "^5.0.0-alpha.2", + "@nestjs/mapped-types": "*", + "@tanstack/react-table": "^8.7.9", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.1.1", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.4.1", + "@types/node": "^16.11.27", + "@types/react": "^18.0.6", + "@types/react-dom": "^18.0.2", + "@types/react-event-listener": "^0.4.12", + "@types/react-router-dom": "^5.2.0", + "@types/styled-components": "^5.1.2", + "axios": "^0.26.1", + "date-fns": "^2.28.0", + "dayjs": "^1.11.8", + "install": "^0.13.0", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "material-ui-numeric-input": "^3.1.0", + "moment": "^2.29.3", + "moment-timezone": "^0.5.37", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-hook-form": "7.25.3", + "react-icons": "^3.10.0", + "react-imask": "^6.4.2", + "react-number-format": "^4.9.3", + "react-router-dom": "^5.2.0", + "react-scripts": "5.0.1", + "react-spring": "^8.0.27", + "react-table": "^7.8.0", + "recharts": "^2.1.14", + "sass": "^1.50.1", + "socket.io-client": "^2.3.1", + "styled-components": "^5.1.1", + "typescript": "^4.6.3", + "web-vitals": "^2.1.4", + "yup": "^0.32.11" + }, + "devDependencies": { + "@types/axios": "^0.14.0", + "@types/jsonwebtoken": "^8.5.8", + "@types/moment": "^2.13.0", + "@types/moment-timezone": "^0.5.30", + "@types/react-table": "^7.7.14", + "@types/socket.io-client": "^1.4.36", + "prettier": "2.3.2" + }, + "scripts": { + "start": "REACT_APP_ENVIROMENT=local react-scripts start", + "start:prod": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "optimizeDeps": { + "exclude": [ + "ract-hook-form" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/frontend/public/40635-ffffff.ico b/frontend/public/40635-ffffff.ico new file mode 100644 index 0000000..5578d71 Binary files /dev/null and b/frontend/public/40635-ffffff.ico differ diff --git a/frontend/public/40635.svg b/frontend/public/40635.svg new file mode 100644 index 0000000..a5f988d --- /dev/null +++ b/frontend/public/40635.svg @@ -0,0 +1,144 @@ + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/core-notes.svg b/frontend/public/core-notes.svg new file mode 100644 index 0000000..fd3c049 --- /dev/null +++ b/frontend/public/core-notes.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000..a11777c Binary files /dev/null and b/frontend/public/favicon.ico differ diff --git a/frontend/public/index.html b/frontend/public/index.html new file mode 100644 index 0000000..664de5f --- /dev/null +++ b/frontend/public/index.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + CoreNotes + + + +
+ + + diff --git a/frontend/public/logo192.png b/frontend/public/logo192.png new file mode 100644 index 0000000..fc44b0a Binary files /dev/null and b/frontend/public/logo192.png differ diff --git a/frontend/public/logo512.png b/frontend/public/logo512.png new file mode 100644 index 0000000..a4e47a6 Binary files /dev/null and b/frontend/public/logo512.png differ diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/frontend/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/frontend/src/App.scss b/frontend/src/App.scss new file mode 100644 index 0000000..717ca96 --- /dev/null +++ b/frontend/src/App.scss @@ -0,0 +1,24 @@ +.root { + display: flex; +} +.title { + flex-grow: 1; +} +// appBarSpacer {} theme.mixins.toolbar; +.content { + flex-grow: 1; + height: 100vh; + overflow: auto; +} +.container { + padding: 0; + margin: 0; + padding-top: 4%; + padding-bottom: 4%; +} +.paper { + // padding: 2%; + display: flex; + overflow: auto; + flex-direction: column; +} diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx new file mode 100644 index 0000000..9767e51 --- /dev/null +++ b/frontend/src/App.test.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { + fireEvent, + render, + screen, + waitFor, + act, + getByLabelText, +} from '@testing-library/react'; +import App from './App'; +import userEvent from '@testing-library/user-event'; +import { + MemoryRouter, + BrowserRouter as Router, + useHistory, +} from 'react-router-dom'; +import AppProvider from './context'; +import Routes from './routes'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import reportWebVitals from './reportWebVitals'; +import { AuthProvider } from './context/AuthContext'; +import { ProviderGlobal } from './context/ContextGlobal'; +import { ReactElement } from 'react-imask/dist/mixin'; +import SignIn from './pages/sign-in/sign-in'; + +const crendentials = { + login: 'admin', + password: 'abc123', +}; + +const Wrapper = ({ children }: { children: React.ReactNode }) => { + return ( + + {children} + {/* */} + + ); +}; + +test('renders learn react link', async () => { + // eslint-disable-next-line testing-library/no-unnecessary-act + const { container } = render(, { wrapper: Wrapper }); + // act(() => { + // const { container } = render(); + // }); + + // Without screen, you need to provide a container: + const email = screen.getByRole('textbox', { name: /E-mail/i }); + const password = screen.getByLabelText('Senha'); + // const password = screen.getByTestId('password'); + const submitButton = screen.getByText(/ENTRAR/i); + + expect(email).toBeInTheDocument(); + expect(password).toBeInTheDocument(); + expect(submitButton).toBeInTheDocument(); + + userEvent.type(email, crendentials.login); + userEvent.type(password, crendentials.password); + // eslint-disable-next-line testing-library/no-unnecessary-act + await act(async () => { + await fireEvent.click(submitButton); + }); + console.log(window.localStorage.getItem('@CORELAB:token')); + expect(await screen.findByText('Faturamentos')).toBeInTheDocument(); + // expect(await screen.findByText(crendentials.password)).toBeInTheDocument(); +}); diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..5bfc4c7 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,30 @@ +import * as React from 'react'; +import { BrowserRouter as Router } from 'react-router-dom'; +import AppProvider from './context'; +import Routes from './routes'; +import { createTheme, ThemeProvider } from '@mui/material'; + +const theme = createTheme({ + palette: { + primary: { + main: '#FFF', + }, + secondary: { + main: '#f5f5f5', + }, + }, +}); + +const App: React.FC = () => { + return ( + + + + + + + + ); +}; + +export default App; diff --git a/frontend/src/Main.tsx b/frontend/src/Main.tsx new file mode 100644 index 0000000..3a92753 --- /dev/null +++ b/frontend/src/Main.tsx @@ -0,0 +1,80 @@ +import * as React from 'react'; +import { styled, createTheme, ThemeProvider } from '@mui/material/styles'; +import CssBaseline from '@mui/material/CssBaseline'; +import MuiDrawer from '@mui/material/Drawer'; +import Box from '@mui/material/Box'; +import MuiAppBar, { AppBarProps as MuiAppBarProps } from '@mui/material/AppBar'; +import Toolbar from '@mui/material/Toolbar'; +import List from '@mui/material/List'; +import Typography from '@mui/material/Typography'; +import Divider from '@mui/material/Divider'; +import IconButton from '@mui/material/IconButton'; +import Badge from '@mui/material/Badge'; +import Container from '@mui/material/Container'; +import Grid from '@mui/material/Grid'; +import Paper from '@mui/material/Paper'; +import Link from '@mui/material/Link'; +import MenuIcon from '@mui/icons-material/Menu'; +import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; +import NotificationsIcon from '@mui/icons-material/Notifications'; +import Orders from './Orders'; + +export default function DashboardContent() { + + const mdTheme = createTheme(); + return ( + <> + + theme.palette.mode === 'light' + ? theme.palette.grey[100] + : theme.palette.grey[900], + flexGrow: 1, + height: '100vh', + overflow: 'auto', + }} + > + + + + {/* Chart */} + + + <> + + + {/* Recent Deposits */} + + + <> + {/* */} + + + {/* Recent Orders */} + + + + + + + + + + ); +} diff --git a/frontend/src/Orders.tsx b/frontend/src/Orders.tsx new file mode 100644 index 0000000..8a33619 --- /dev/null +++ b/frontend/src/Orders.tsx @@ -0,0 +1,93 @@ +import * as React from 'react'; +import Link from '@mui/material/Link'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; +import Title from './Title'; + +// Generate Order Data +function createData( + id: number, + date: string, + name: string, + shipTo: string, + paymentMethod: string, + amount: number, +) { + return { id, date, name, shipTo, paymentMethod, amount }; +} + +const rows = [ + createData( + 0, + '16 Mar, 2019', + 'Elvis Presley', + 'Tupelo, MS', + 'VISA ⠀•••• 3719', + 312.44, + ), + createData( + 1, + '16 Mar, 2019', + 'Paul McCartney', + 'London, UK', + 'VISA ⠀•••• 2574', + 866.99, + ), + createData(2, '16 Mar, 2019', 'Tom Scholz', 'Boston, MA', 'MC ⠀•••• 1253', 100.81), + createData( + 3, + '16 Mar, 2019', + 'Michael Jackson', + 'Gary, IN', + 'AMEX ⠀•••• 2000', + 654.39, + ), + createData( + 4, + '15 Mar, 2019', + 'Bruce Springsteen', + 'Long Branch, NJ', + 'VISA ⠀•••• 5919', + 212.79, + ), +]; + +function preventDefault(event: React.MouseEvent) { + event.preventDefault(); +} + +export default function Orders() { + return ( + + Recent Orders + + + + Date + Name + Ship To + Payment Method + Sale Amount + + + + {rows.map((row) => ( + + {row.date} + {row.name} + {row.shipTo} + {row.paymentMethod} + {`$${row.amount}`} + + ))} + +
+ + See more orders + +
+ ); +} \ No newline at end of file diff --git a/frontend/src/Route.tsx b/frontend/src/Route.tsx new file mode 100755 index 0000000..2615571 --- /dev/null +++ b/frontend/src/Route.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { + Redirect, + Route as RouteDOM, + RouteProps as RouteDOMProps, +} from 'react-router-dom'; +import { useAuth } from './context/AuthContext'; + +interface RouteProps extends RouteDOMProps { + isPrivate?: boolean; + component: React.ComponentType; +} +const crumbs: any[] = []; +const Route: React.FC = ({ + isPrivate = false, + component: Component, + ...rest +}) => { + const { user } = useAuth(); + return ( + { + if (!(isPrivate === !!user)) { + crumbs.splice(0, crumbs.length); + } + return isPrivate === !!user ? ( + + ) : ( + + ); + }} + /> + ); +}; + +export default Route; diff --git a/frontend/src/Title.tsx b/frontend/src/Title.tsx new file mode 100644 index 0000000..8714e52 --- /dev/null +++ b/frontend/src/Title.tsx @@ -0,0 +1,14 @@ +import * as React from 'react'; +import Typography from '@mui/material/Typography'; + +interface TitleProps { + children?: React.ReactNode; +} + +export default function Title(props: TitleProps) { + return ( + + {props.children} + + ); +} \ No newline at end of file diff --git a/frontend/src/assets/images/40635-ffffff.svg b/frontend/src/assets/images/40635-ffffff.svg new file mode 100644 index 0000000..b5a360b --- /dev/null +++ b/frontend/src/assets/images/40635-ffffff.svg @@ -0,0 +1,144 @@ + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/images/40635.svg b/frontend/src/assets/images/40635.svg new file mode 100644 index 0000000..a5f988d --- /dev/null +++ b/frontend/src/assets/images/40635.svg @@ -0,0 +1,144 @@ + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/images/core-notes.svg b/frontend/src/assets/images/core-notes.svg new file mode 100644 index 0000000..fd3c049 --- /dev/null +++ b/frontend/src/assets/images/core-notes.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/images/home.svg b/frontend/src/assets/images/home.svg new file mode 100644 index 0000000..b62177b --- /dev/null +++ b/frontend/src/assets/images/home.svg @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + site_sec_A_02 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/communs/enums/cstIpiTrib.ts b/frontend/src/communs/enums/cstIpiTrib.ts new file mode 100644 index 0000000..064d550 --- /dev/null +++ b/frontend/src/communs/enums/cstIpiTrib.ts @@ -0,0 +1,53 @@ +const optionsEnum: any = { + ID_0: { id: '00', description: '00-Entrada com recuperação de crédito'}, + ID_49: { id: '49', description: '49-Outras entradas' }, + ID_50: { id: '50', description: '50-Saída tributada' }, + ID_99: { id: '99', description: '99-Outras saídas' }, +}; + +export class CstIpint { + getId(id: string) { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return element; + } + } + return null; + } + + getObject(id: string) { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return optionsEnum[element]; + } + } + return {}; + } +} + +export const optionsCstIpiTrib = () => { + const keys = Object.keys(optionsEnum); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(optionsEnum[element]); + } + return list; +}; + +export const find = (id: string) => { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return optionsEnum[element]; + } + } + return {}; +}; + diff --git a/frontend/src/communs/enums/cstIpint.ts b/frontend/src/communs/enums/cstIpint.ts new file mode 100644 index 0000000..885f28a --- /dev/null +++ b/frontend/src/communs/enums/cstIpint.ts @@ -0,0 +1,58 @@ +const optionsEnum: any = { + ID_1: { id: '01', description: '01-Entrada tributada com alíquota zero' }, + ID_2: { id: '02', description: '02-Entrada isenta' }, + ID_03: { id: '03', description: '03-Entrada não-tributada' }, + ID_04: { id: '04', description: '04-Entrada imune' }, + ID_05: { id: '05', description: '05-Entrada com suspensão' }, + ID_51: { id: '51', description: '51-Saída tributada com alíquota zero' }, + ID_52: { id: '52', description: '52-Saída isenta' }, + ID_53: { id: '53', description: '53-Saída não-tributada' }, + ID_54: { id: '54', description: '54-Saída imune' }, + ID_55: { id: '55', description: '55-Saída com suspensão' }, +}; + +export class CstIpint { + getId(id: string) { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return element; + } + } + return null; + } + + getObject(id: string) { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return optionsEnum[element]; + } + } + return {}; + } +} + +export const optionsCstIpint = () => { + const keys = Object.keys(optionsEnum); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(optionsEnum[element]); + } + return list; +}; + +export const findCstIpint = (id: string) => { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return optionsEnum[element]; + } + } + return {}; +}; diff --git a/frontend/src/communs/enums/cstPisnt.ts b/frontend/src/communs/enums/cstPisnt.ts new file mode 100644 index 0000000..5934450 --- /dev/null +++ b/frontend/src/communs/enums/cstPisnt.ts @@ -0,0 +1,64 @@ +const optionsEnum: any = { + ID_4: { + id: '04', + description: + '04-Operação Tributável - Tributação Monofásica - (Alíquota Zero)', + }, + ID_5: { id: '05', description: '05 - Operação Tributável (ST)' }, + ID_6: { id: '06', description: '06-Operação Tributável - Alíquota Zero' }, + ID_7: { id: '07', description: '07-Operação Isenta da contribuição' }, + ID_8: { + id: '08', + description: '08-Operação Sem Incidência da contribuição', + }, + ID_9: { + id: '09', + description: '09-Operação com suspensão da contribuição', + }, +}; + +export class CstIpint { + getId(id: string) { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return element; + } + } + return null; + } + + getObject(id: string) { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return optionsEnum[element]; + } + } + return {}; + } +} + +export const optionsCstPisnt = () => { + const keys = Object.keys(optionsEnum); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(optionsEnum[element]); + } + return list; +}; + +export const find = (id: string) => { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return optionsEnum[element]; + } + } + return {}; +}; diff --git a/frontend/src/communs/enums/generic-enum.ts b/frontend/src/communs/enums/generic-enum.ts new file mode 100644 index 0000000..5f74b86 --- /dev/null +++ b/frontend/src/communs/enums/generic-enum.ts @@ -0,0 +1,706 @@ +export const tpNfOptions: any = { + ENTRADA: { id: '0', description: '0 - Entrada' }, + SAIDA: { id: '1', description: '1 - Saída' }, +}; + +export const environmentOptions: any = { + PRODUCAO: { id: '1', description: '1 - Produção' }, + HOMOLOGACAO: { id: '2', description: '2 - Homologação' }, +}; + +export const tpImpOptions: any = { + SEM_DANFE: { id: '0', description: '0 - Sem DANFE' }, + DANFE_RETRATO: { id: '1', description: '1 - DANFe Retrato' }, + DANFE_PAISAGEM: { id: '2', description: '2 - DANFe Paisagem' }, + DANFE_SIMPLIFICADO: { id: '3', description: '3 - DANFe Simplificado' }, + DANFE_NFCE: { id: '4', description: '4 - DANFe NFC-e' }, + DANFE_NFCE_MSG_ELETRONICA: { + id: '5', + description: '5 - DANFe NFC-e em mensagem eletrônica', + }, +}; + +export const tpEmisOptions: any = { + NORMAL: { id: '1', description: '1 - Normal' }, + FS: { id: '2', description: '2 - Contingência FS' }, + NFF: { id: '3', description: '3 - Regime Especial NFF (NT 2021.002)' }, + DPEC: { id: '4', description: '4 - Contingência DPEC' }, + FSDA: { id: '5', description: '5 - Contingência FSDA' }, + SVCRS: { id: '7', description: '7 - Contingência SVC - RS' }, + NFCE: { id: '9', description: '9 - Contingência off-line NFC-e' }, +}; + +export const finNFeOptions: any = { + NORMAL: { id: '1', description: '1 - NFe normal' }, + NFE_COMPLEMENTAR: { id: '2', description: '2 - NFe complementar' }, + NFE_AJUSTE: { id: '3', description: '3 - NFe de ajuste' }, + DEVOLUCAO_RETORNO: { id: '4', description: '4 - Devolução/Retorno' }, +}; + +export const indFinalOptions: any = { + NAO: { id: '0', description: '0 - Não' }, + CONSUMIDOR_FINAL: { id: '1', description: '1 - Consumidor final' }, +}; +// ) +export const indPresOptions: any = { + NAO_SE_APLICA: { id: '0', description: '0 - Não se aplica' }, + OPERACAO_PRESENCIAL: { id: '1', description: '1 - Operação presencial' }, + NAO_PRESENCIAL_INTERNET: { + id: '2', + description: '2 - Não presencial, internet', + }, + NAO_PRESENCIAL_TEL: { + id: '3', + description: '3 - Não presencial, teleatendimento', + }, + NAO_PRESENCIAL_ENTREGA: { + id: '4', + description: '4 - NFC-e entrega em domicílio', + }, + NAO_PRESENCIAL_FORA_ESTABELECIMENTO: { + id: '5', + description: '5 - Operação presencial, fora do estabelecimento', + }, + NAO_PRESENCIAL_OUTROS: { + id: '9', + description: '9 - Não presencial, outros', + }, +}; + +export const procEmiOptions: any = { + 0: { + id: '0', + description: '0 - Emissão de NF-e com aplicativo do contribuinte', + }, + 1: { id: '1', description: '1 - Emissão de NF-e avulsa pelo Fisco' }, + 2: { + id: '2', + description: + '2 - Emissão de NF-e avulsa, pelo contribuinte com seu certificado digital, através do site do Fisco', + }, + 3: { + id: '3', + description: + '3- Emissão de NF-e pelo contribuinte com aplicativo fornecido pelo Fisco', + }, +}; + +export const idDestOptions: any = { + 1: { + id: '1', + description: '1 - Interna', + }, + 2: { id: '2', description: '2 - Interestadual' }, + 3: { + id: '3', + description: '3 - Exterior', + }, +}; + +export const crtOptions: any = { + 1: { + id: '1', + description: '1 - Simples Nacional', + }, + 2: { + id: '2', + description: + '2 - Simples Nacional - excesso de sublimite de receita bruta', + }, + 3: { + id: '3', + description: '3 - Regime Normal', + }, +}; + +export const indTotOptions: any = { + 0: { + id: '0', + description: + '0 - O valor do item (vProd) não compõe o valor total da NF-e (vProd)', + }, + 1: { + id: '1', + description: + '1 - O valor do item (vProd) compõe o valor total da NF-e (vProd)', + }, +}; + +export const origOptions: any = { + NACIONAL: { id: '0', description: '0 - Nacional' }, + IMPORTACAO_DIRETA: { id: '1', description: '1 - Importação direta' }, + MERCADO_INTERNO: { + id: '2', + description: '2 - Adquirida no mercado interno', + }, +}; + +export const cstIpintOptions: any = { + ID_1: { id: '01', description: '01-Entrada tributada com alíquota zero' }, + ID_2: { id: '02', description: '02-Entrada isenta' }, + ID_03: { id: '03', description: '03-Entrada não-tributada' }, + ID_04: { id: '04', description: '04-Entrada imune' }, + ID_05: { id: '05', description: '05-Entrada com suspensão' }, + ID_51: { id: '51', description: '51-Saída tributada com alíquota zero' }, + ID_52: { id: '52', description: '52-Saída isenta' }, + ID_53: { id: '53', description: '53-Saída não-tributada' }, + ID_54: { id: '54', description: '54-Saída imune' }, + ID_55: { id: '55', description: '55-Saída com suspensão' }, +}; + +export const cstIpiTribOptions: any = { + ID_0: { id: '00', description: '00-Entrada com recuperação de crédito' }, + ID_49: { id: '49', description: '49-Outras entradas' }, + ID_50: { id: '50', description: '50-Saída tributada' }, + ID_99: { id: '99', description: '99-Outras saídas' }, +}; + +export const cstPisntOptions: any = { + ID_4: { + id: '04', + description: + '04-Operação Tributável - Tributação Monofásica - (Alíquota Zero)', + }, + ID_6: { id: '06', description: '06-Operação Tributável - Alíquota Zero' }, + ID_7: { id: '07', description: '07-Operação Isenta da contribuição' }, + ID_8: { + id: '08', + description: '08-Operação Sem Incidência da contribuição', + }, + ID_9: { + id: '09', + description: '09-Operação com suspensão da contribuição', + }, +}; + +export const cstCofinsntOptions: any = { + ID_4: { + id: '04', + description: + '04-Operação Tributável - Tributação Monofásica - (Alíquota Zero)', + }, + ID_5: { id: '05', description: '05 - Operação Tributável (ST)' }, + ID_6: { id: '06', description: '06-Operação Tributável - Alíquota Zero' }, + ID_7: { id: '07', description: '07-Operação Isenta da contribuição' }, + ID_8: { + id: '08', + description: '08-Operação Sem Incidência da contribuição', + }, + ID_9: { + id: '09', + description: '09-Operação com suspensão da contribuição', + }, +}; + +export const indIEDestOptions: any = { + 1: { + id: '1', + description: '1 - Contribuinte ICMSpagamento à vista', + }, + 2: { id: '2', description: '2 - Contribuinte isento de inscrição' }, + 3: { id: '3', description: '9 - Não Contribuinte' }, +}; + +export const modFreteOptions: any = { + 0: { + id: '0', + description: '0 - Contratação do Frete por conta do remetente (CIF)', + }, + 1: { + id: '1', + description: + '1- Contratação do frete por conta do destinatário/remetente (FOB)', + }, + 2: { + id: '2', + description: '2 - Contratação do frete por conta de terceiros', + }, + 3: { + id: '3', + description: '3 - Transporte próprio por conta do remetente', + }, + 4: { + id: '4', + description: '4 - Transporte próprio por conta do destinatário', + }, + 9: { + id: '9', + description: '9 - Sem Ocorrência de transporte', + }, +}; + +export const indPagOptions: any = { + 0: { + id: '0', + description: '0 - Pagamento à vista', + }, + 1: { + id: '1', + description: '1 - Pagamento à prazo', + }, +}; + +export const tPagOptions: any = { + 1: { id: '01', description: '01 - Dinheiro' }, + 2: { id: '02', description: '02 - Cheque' }, + 3: { id: '03', description: '03 - Cartão de Crédito' }, + 4: { id: '04', description: '04 - Cartão de Débito' }, + 5: { id: '05', description: '05 - Crédito Loja' }, + 10: { id: '10', description: '10 - Vale Alimentação' }, + 11: { id: '11', description: '11 - Vale Refeição' }, + 12: { id: '12', description: '12 - Vale Presente' }, + 13: { id: '13', description: '13 - Vale Combustível' }, + 15: { id: '15', description: '15 - Boleto Bancário' }, + 16: { id: '16', description: '16 - Depósito Bancário' }, + 17: { id: '17', description: '17 - Pagamento Instantâneo (PIX)' }, + 18: { + id: '18', + description: '18 - Transferência bancária, Carteira Digital', + }, + 19: { + id: '19', + description: '19 - Programa de fidelidade, Cashback, Crédito Virtual', + }, + 90: { id: '90', description: '90 - Sem pagamento' }, + 99: { id: '99', description: '99 - Outros' }, +}; + +export const yesOrNoOptions: any = { + 0: { + id: '0', + description: '0 - Não', + }, + 1: { + id: '1', + description: '1 - Sim', + }, +}; + +export const yesOrNoOrBothOptions: any = { + 0: { + id: '0', + description: '0 - Não', + }, + 1: { + id: '1', + description: '1 - Sim', + }, + 2: { + id: '2', + description: '2 - Todos', + }, +}; + +export const typeQueryOptions: any = { + 0: { + id: 'additionalHonorarium', + description: 'Honorários adicionais', + }, + 1: { + id: 'legalProcess', + description: 'Processos', + }, + 2: { + id: 'additionalExpense', + description: 'Despesas adicionais', + }, +}; + +export const typeQueryOperationOptions: any = { + 0: { + id: 'received', + description: 'À receber', + }, + 1: { + id: 'payable', + description: 'À pagar', + }, + 2: { + id: 'all', + description: 'Todas', + }, +}; + +export const stateLegalProcessOptions: any = { + 0: { id: '1', description: 'Postulatória' }, + 1: { id: '2', description: 'Instrutória' }, + 2: { id: '3', description: 'Decisória' }, + 3: { id: '4', description: 'Recursal' }, + 4: { id: '5', description: 'Executória' }, +}; + +export const typeUserOptions: any = { + 0: { id: 'admin', description: 'Administrador' }, + 1: { id: 'user', description: 'Usuário' }, +}; + +export const typeQueryExpenditurePortionOptions: any = { + 0: { id: 'admin', description: 'Administrador' }, + 1: { id: 'user', description: 'Usuário' }, +}; + +export const monthOptions: any = { + 1: { id: '01', description: 'Janeiro' }, + 2: { id: '02', description: 'Fevereiro' }, + 3: { id: '03', description: 'Março' }, + 4: { id: '04', description: 'Abril' }, + 5: { id: '05', description: 'Maio' }, + 6: { id: '06', description: 'Junho' }, + 7: { id: '07', description: 'Julho' }, + 8: { id: '08', description: 'Agosto' }, + 9: { id: '09', description: 'Setembro' }, + 10: { id: '10', description: 'Outubro' }, + 11: { id: '11', description: 'Novembro' }, + 12: { id: '12', description: 'Dezembro' }, +}; + +export const maritalStatusOptions: any = { + '1': { + id: '01', + description: 'Solteiro(a)', + }, + '2': { + id: '02', + description: 'Casado(a)', + }, + '3': { + id: '03', + description: 'Separado(a)', + }, + '4': { + id: '04', + description: 'Divorciado(a)', + }, + '5': { + id: '05', + description: 'Viúvo(a)', + }, + '6': { + id: '06', + description: 'União Estável', + }, +}; +export const phaseOptions: any = { + '1': { + id: '01', + description: 'Fase Inicial', + }, + '2': { + id: '02', + description: 'Fase de Audiência', + }, + '3': { + id: '03', + description: 'Fase de Citação', + }, + '4': { + id: '04', + description: 'Fase de Conciliação', + }, + '5': { + id: '05', + description: 'Fase de Contestação', + }, + '6': { + id: '06', + description: 'Fase de Sentença', + }, +}; + +export const resultOptions: any = { + '1': { + id: '01', + description: 'Acordo', + }, + '2': { + id: '02', + description: 'Extinto', + }, + '3': { + id: '03', + description: 'Improcedente', + }, + '4': { + id: '04', + description: 'Parcialmente Procedente', + }, + '5': { + id: '05', + description: 'Procedente', + }, +}; + +export const statusOptions: any = { + '1': { + id: '01', + description: 'Ativo', + }, + '2': { + id: '02', + description: 'Encerrado', + }, +}; + +export const urgencyOptions: any = { + '1': { + id: '01', + description: 'Pode esperar', + }, + '2': { + id: '02', + description: 'Pouco urgente', + }, + '3': { + id: '03', + description: 'Requer atenção', + }, + '4': { + id: '04', + description: 'Pode esperar', + }, +}; + +export const taskSituationOptions: any = { + '1': { + id: '01', + description: 'Não Iniciada', + }, + '2': { + id: '02', + description: 'Em andamento', + }, + '3': { + id: '03', + description: 'Concluída', + }, +}; + +export const howDidYouFindOptions = { + '1': { + id: '01', + description: 'Agronegócio', + }, + '2': { + id: '02', + description: 'Alimentos e Bebidas', + }, + '3': { + id: '03', + description: 'Arquitetura', + }, + '4': { + id: '04', + description: 'Atacado e Distribuição', + }, + '5': { + id: '05', + description: 'Bebidas', + }, + '6': { + id: '06', + description: 'Beleza', + }, + '7': { + id: '07', + description: 'Cartório', + }, + '8': { + id: '08', + description: 'Comércio em Geral', + }, + '9': { + id: '09', + description: 'Condomínio e Administradora', + }, + '10': { + id: '10', + description: 'Construção Civil', + }, + '11': { + id: '11', + description: 'Contabilidade', + }, + '12': { + id: '12', + description: 'Corretora de Imóveis', + }, + '13': { + id: '13', + description: 'Corretora de Seguros', + }, + '14': { + id: '14', + description: 'Educação', + }, + '15': { + id: '15', + description: 'Indústria', + }, + '16': { + id: '16', + description: 'Material de Construção', + }, + '17': { + id: '17', + description: 'Medicina e Saúde', + }, + '18': { + id: '18', + description: 'Metalúrgica', + }, + '19': { + id: '19', + description: 'Moda', + }, + '20': { + id: '20', + description: 'Outros', + }, + '21': { + id: '21', + description: 'Tecnologia', + }, + '22': { + id: '22', + description: 'Veículos e Peças', + }, +}; + +export const expertiseSituationOptions: any = { + '1': { + id: '01', + description: 'Agendada', + }, + '2': { + id: '02', + description: 'Concluída', + }, + '3': { + id: '03', + description: 'Cancelada', + }, +}; + +export const typeNumberPhone: any = { + CELULAR: { id: '1', description: 'Celular' }, + RESIDENCIAL: { id: '2', description: 'Residencial' }, + TRABALHO: { id: '3', description: 'Trabalho' }, + PARENTE: { id: '4', description: 'Parente' }, + MORA_MESMA_RESIDENCIA: { id: '5', description: 'Mora na mesma residência' }, + VIZINHO: { id: '6', description: 'Vizinho' }, +}; + +export const typeLegalProcessOptions: any = { + '1': { + id: '01', + description: 'Judicial', + }, + '2': { + id: '02', + description: 'Administrativo', + }, +}; + +export const phaseLegalProcessOptions: any = { + '1': { + id: '01', + description: 'Fase Inicial', + }, + '2': { + id: '02', + description: 'Fase de Audiência', + }, + '3': { + id: '03', + description: 'Fase de Citação', + }, + '4': { + id: '04', + description: 'Fase de Conciliação', + }, + '5': { + id: '05', + description: 'Fase de Contestação', + }, + '6': { + id: '06', + description: 'Fase de Sentença', + }, +}; + +export const permissionOptions: any = { + '1': { + id: '1', + description: 'Criar usuário', + }, + '2': { + id: '2', + description: 'Alterar usuário', + }, + '3': { + id: '3', + description: 'Deletar usuário', + }, + '4': { + id: '4', + description: 'Listar usuário', + }, + '5': { + id: '5', + description: 'Criar tarefa', + }, + '6': { + id: '6', + description: 'Alterar tarefa', + }, + '7': { + id: '7', + description: 'Excluir tarefa', + }, + '8': { + id: '8', + description: 'Listar tarefa', + }, + '9': { + id: '9', + description: 'Ação master na entidade usuário', + }, +}; + +export class GenericEnum { + // Vai receber uma constante do tipo enum + constructor(private enumProperties: any) {} + + getId(id: string) { + const keys = Object.keys(this.enumProperties); + for (const key in keys) { + const element: any = keys[key]; + if (id === this.enumProperties[element].id) { + return element; + } + } + return null; + } + + getObject(id: string): { id: string; description: string } { + const keys = Object.keys(this.enumProperties); + for (const key in keys) { + const element: any = keys[key]; + if (id === this.enumProperties[element].id) { + return this.enumProperties[element]; + } + } + return { id: '', description: '' }; + } + + optionsList = () => { + const keys = Object.keys(this.enumProperties); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(this.enumProperties[element]); + } + return list; + }; +} diff --git a/frontend/src/communs/enums/labor.ts b/frontend/src/communs/enums/labor.ts new file mode 100644 index 0000000..0cfd465 --- /dev/null +++ b/frontend/src/communs/enums/labor.ts @@ -0,0 +1,79 @@ +const Labor: any = { + SEM_PRODUTO: { id: '0', description: 'Sem produto' }, + COM_PRODUTO: { id: '1', description: 'Com produto' }, +}; + +export class LaborEnum { + getId(id: string) { + const keys = Object.keys(Labor); + for (const key in keys) { + const element: any = keys[key]; + if (id === Labor[element].id) { + return element; + } + } + return null; + } + + getObject(id: string) { + const keys = Object.keys(Labor); + for (const key in keys) { + const element: any = keys[key]; + if (id === Labor[element].id) { + return Labor[element]; + } + } + return {}; + } +} + +export const optionsLabor = (): { + name?: string; + description?: string; + id?: string; + code?: string; +}[] => { + const keys = Object.keys(Labor); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(Labor[element]); + } + return list; +}; + +export const laborFind = (id: string) => { + const keys = Object.keys(Labor); + for (const key in keys) { + const element: any = keys[key]; + if (id === Labor[element].id) { + return Labor[element]; + } + } + return {}; +}; + +export const laborFindDescription = (description: string) => { + const keys = Object.keys(Labor); + for (const key in keys) { + const element: any = keys[key]; + if (description === Labor[element].description) { + return Labor[element]; + } + } + return {}; +}; + +// Enum labor: +// ORCAMENTO(1, "Orçamento"), +// APROVADO(2, "Aprovado/Em andamento"), +// ENTREGADO(3, "Finalizado"), +// FALTA_PECA(5, "Falta peça"), +// NAO_APROVADO(6, "Não aprovado"), +// SEM_CONSERTO(7, "Sem conserto"), +// SERVICO_RELIAZADO(9, "Serviço realizado"), +// GARANTIA_ANDAMENTO(10, "Garantia em andamento"), +// GARANTIA_FALTA_PECA(11, "Garantia em falta peça"), +// GARANTIA_CONCLUIDA(12, "Garantia concluída"), +// TODOS(8, "Todos"); diff --git a/frontend/src/communs/enums/originMerchandise.ts b/frontend/src/communs/enums/originMerchandise.ts new file mode 100644 index 0000000..9bcd7b8 --- /dev/null +++ b/frontend/src/communs/enums/originMerchandise.ts @@ -0,0 +1,51 @@ +const optionsEnum: any = { + NACIONAL: { id: '0', description: '0-Nacional' }, + IMPORTACAO_DIRETA: { id: '1', description: '1-Importação direta' }, + MERCADO_INTERNO: { id: '2', description: '2-Adquirida no mercado interno' }, +}; + +export class OriginMerchandise { + getId(id: string) { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return element; + } + } + return null; + } + + getObject(id: string) { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return optionsEnum[element]; + } + } + return {}; + } +} + +export const optionsList = () => { + const keys = Object.keys(optionsEnum); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(optionsEnum[element]); + } + return list; +}; + +export const find = (id: string) => { + const keys = Object.keys(optionsEnum); + for (const key in keys) { + const element: any = keys[key]; + if (id === optionsEnum[element].id) { + return optionsEnum[element]; + } + } + return {}; +}; diff --git a/frontend/src/communs/enums/state.ts b/frontend/src/communs/enums/state.ts new file mode 100644 index 0000000..d4e044d --- /dev/null +++ b/frontend/src/communs/enums/state.ts @@ -0,0 +1,72 @@ +const State: any = { + ORCAMENTO: { id: '1', description: 'Orçamento' }, + APROVADO: { id: '2', description: 'Aprovado' }, + ENTREGADO: { id: '3', description: 'Entregado' }, + ENTREGADO_SEM_CONSERTO: { id: '11', description: 'Entregado sem custo' }, + FALTA_PECA: { id: '4', description: 'Falta peça' }, + NAO_APROVADO: { id: '5', description: 'Não aprovado' }, + SEM_CONSERTO: { id: '6', description: 'Sem conserto' }, + SERVICO_REALIZADO: { id: '7', description: 'Serviço realizado' }, + GARANTIA_ANDAMENTO: { id: '8', description: 'Garantia em andamento' }, + GARANTIA_FALTA_PECA: { id: '9', description: 'Garanria em falta de peça' }, + GARANTIA_CONCLUIDA: { id: '10', description: 'Garantia concluída' }, +}; + +export class StateEnum { + getId(id: string) { + const keys = Object.keys(State); + for (const key in keys) { + const element: any = keys[key]; + if (id === State[element].id) { + return element; + } + } + return null; + } + + getObject(id: string) { + const keys = Object.keys(State); + for (const key in keys) { + const element: any = keys[key]; + if (id === State[element].id) { + return State[element]; + } + } + return {}; + } +} + +export const optionsState = () => { + const keys = Object.keys(State); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(State[element]); + } + return list; +}; + +export const stateFind = (id: string) => { + const keys = Object.keys(State); + for (const key in keys) { + const element: any = keys[key]; + if (id === State[element].id) { + return State[element]; + } + } + return {}; +}; + +// Enum state: +// ORCAMENTO(1, "Orçamento"), +// APROVADO(2, "Aprovado/Em andamento"), +// ENTREGADO(3, "Finalizado"), +// FALTA_PECA(5, "Falta peça"), +// NAO_APROVADO(6, "Não aprovado"), +// SEM_CONSERTO(7, "Sem conserto"), +// SERVICO_RELIAZADO(9, "Serviço realizado"), +// GARANTIA_ANDAMENTO(10, "Garantia em andamento"), +// GARANTIA_FALTA_PECA(11, "Garantia em falta peça"), +// GARANTIA_CONCLUIDA(12, "Garantia concluída"), +// TODOS(8, "Todos"); diff --git a/frontend/src/communs/enums/typeNumberPhone.ts b/frontend/src/communs/enums/typeNumberPhone.ts new file mode 100644 index 0000000..563ddc4 --- /dev/null +++ b/frontend/src/communs/enums/typeNumberPhone.ts @@ -0,0 +1,30 @@ +export const TypeNumberPhone: any = { + CELULAR: { id: '1', description: 'Celular' }, + RESIDENCIAL: { id: '2', description: 'Residencial' }, + TRABALHO: { id: '3', description: 'Trabalho' }, + PARENTE: { id: '4', description: 'Parente' }, + MORA_MESMA_RESIDENCIA: { id: '5', description: 'Mora na mesma residência' }, + VIZINHO: { id: '6', description: 'Vizinho' }, +}; + +export const optionsTypeNumberPhone = () => { + const keys = Object.keys(TypeNumberPhone); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(TypeNumberPhone[element]); + } + return list; +}; + +export const typeNumberPhoneFind = (id: string) => { + const keys = Object.keys(TypeNumberPhone); + for (const key in keys) { + const element: any = keys[key]; + if (id === TypeNumberPhone[element].id) { + return TypeNumberPhone[element]; + } + } + return {}; +}; diff --git a/frontend/src/communs/enums/warrantyTime.ts b/frontend/src/communs/enums/warrantyTime.ts new file mode 100644 index 0000000..9149d05 --- /dev/null +++ b/frontend/src/communs/enums/warrantyTime.ts @@ -0,0 +1,31 @@ +export const WarrantyTime: any = { + SEM: { id: '0', description: 'Sem garantia' }, + UM_MES: { id: '1', description: '1 mês' }, + TRES_MESES: { id: '3', description: '3 meses' }, + QUATRO_MESES: { id: '4', description: '4 meses' }, + CINCO_MESES: { id: '5', description: '5 meses' }, + SEIS_MESES: { id: '6', description: '6 meses' }, + UM_ANO: { id: '12', description: '1 ano' }, +}; + +export const optionsWarrantyTime = () => { + const keys = Object.keys(WarrantyTime); + + const list = []; + for (const key in keys) { + const element: any = keys[key]; + list.push(WarrantyTime[element]); + } + return list; +}; + +export const warrantyTimeFind = (id: string) => { + const keys = Object.keys(WarrantyTime); + for (const key in keys) { + const element: any = keys[key]; + if (id === WarrantyTime[element].id) { + return WarrantyTime[element]; + } + } + return {}; +}; diff --git a/frontend/src/communs/interfaces.ts b/frontend/src/communs/interfaces.ts new file mode 100644 index 0000000..c5f2da3 --- /dev/null +++ b/frontend/src/communs/interfaces.ts @@ -0,0 +1,37 @@ +import { IconButtonProps } from '@mui/material/IconButton'; + +export interface not {} + +export interface ExpandMoreProps extends IconButtonProps { + expand: boolean; +} + +export interface ITask { + id?: string; + title?: string; + detail?: string | null; + color?: string | null; + user?: { + id: string; + name: string; + }; + favorite: boolean; + date?: Date; +} + +export interface ICardTask { + data: ITask; + index: number; + setIndex: (number: number) => void; + setData: (data: ITask) => void; + setOpenModal: (open: boolean) => void; +} + +export interface IUpdate { + data: ITask; +} + +export interface ICardAddTask { + setOpenModal: (openModal: boolean) => void; + setData: (data: ITask) => void; +} diff --git a/frontend/src/communs/tablePaginationAssistant.ts b/frontend/src/communs/tablePaginationAssistant.ts new file mode 100644 index 0000000..9f821d4 --- /dev/null +++ b/frontend/src/communs/tablePaginationAssistant.ts @@ -0,0 +1,13 @@ +interface IDisplayRows { + from: any; + to: any; + count: any; +} + +export const defaultLabelDisplayedRows = ({ + from, + to, + count, +}: IDisplayRows) => { + return `${from}–${to} de ${count !== -1 ? count : `mais do que ${to}`}`; +}; diff --git a/frontend/src/communs/validations/cnpj.ts b/frontend/src/communs/validations/cnpj.ts new file mode 100644 index 0000000..e62e731 --- /dev/null +++ b/frontend/src/communs/validations/cnpj.ts @@ -0,0 +1,49 @@ +export const extraValidationCNPJ = (cnpj: string) => { + cnpj = cnpj.replace(/[^\d]+/g, ''); + + if (cnpj.length == 11) return true; + if (cnpj == '') return false; + + if (cnpj.length != 14) return false; + + // Elimina CNPJs invalidos conhecidos + if ( + cnpj == '00000000000000' || + cnpj == '11111111111111' || + cnpj == '22222222222222' || + cnpj == '33333333333333' || + cnpj == '44444444444444' || + cnpj == '55555555555555' || + cnpj == '66666666666666' || + cnpj == '77777777777777' || + cnpj == '88888888888888' || + cnpj == '99999999999999' + ) + return false; + + // Valida DVs + let tamanho = cnpj.length - 2; + let numeros: any = cnpj.substring(0, tamanho); + let digitos: any = cnpj.substring(tamanho); + let soma = 0; + let pos = tamanho - 7; + for (let i = tamanho; i >= 1; i--) { + soma += numeros.charAt(tamanho - i) * pos--; + if (pos < 2) pos = 9; + } + let resultado: any = soma % 11 < 2 ? 0 : 11 - (soma % 11); + if (resultado != digitos.charAt(0)) return false; + + tamanho = tamanho + 1; + numeros = cnpj.substring(0, tamanho); + soma = 0; + pos = tamanho - 7; + for (let i = tamanho; i >= 1; i--) { + soma += numeros.charAt(tamanho - i) * pos--; + if (pos < 2) pos = 9; + } + resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11); + if (resultado != digitos.charAt(1)) return false; + + return true; +}; diff --git a/frontend/src/communs/validations/cpf.ts b/frontend/src/communs/validations/cpf.ts new file mode 100644 index 0000000..6418ab8 --- /dev/null +++ b/frontend/src/communs/validations/cpf.ts @@ -0,0 +1,45 @@ +export const extraValidationCPF = (strCPF: string, required = true) => { + var Soma; + var Resto; + Soma = 0; + + if (strCPF == '' && required === false) return true; + + strCPF = strCPF.replace(/\D/g, ''); + + if (strCPF.length > 11) { + return true; + } + + if ( + strCPF == '00000000000' || + strCPF == '00000000000' || + strCPF == '11111111111' || + strCPF == '22222222222' || + strCPF == '33333333333' || + strCPF == '44444444444' || + strCPF == '55555555555' || + strCPF == '66666666666' || + strCPF == '77777777777' || + strCPF == '88888888888' || + strCPF == '99999999999' || + strCPF.length < 11 + ) + return false; + + for (let i = 1; i <= 9; i++) + Soma = Soma + parseInt(strCPF.substring(i - 1, i)) * (11 - i); + Resto = (Soma * 10) % 11; + + if (Resto == 10 || Resto == 11) Resto = 0; + if (Resto != parseInt(strCPF.substring(9, 10))) return false; + + Soma = 0; + for (let i = 1; i <= 10; i++) + Soma = Soma + parseInt(strCPF.substring(i - 1, i)) * (12 - i); + Resto = (Soma * 10) % 11; + + if (Resto == 10 || Resto == 11) Resto = 0; + if (Resto != parseInt(strCPF.substring(10, 11))) return false; + return true; +}; diff --git a/frontend/src/componets/ToastContainer/Toast/index.tsx b/frontend/src/componets/ToastContainer/Toast/index.tsx new file mode 100755 index 0000000..fec6550 --- /dev/null +++ b/frontend/src/componets/ToastContainer/Toast/index.tsx @@ -0,0 +1,60 @@ +import React, { useEffect, useState } from 'react'; +import { + FiAlertCircle, + FiCheckCircle, + FiInfo, + FiXCircle, +} from 'react-icons/fi'; +import { ToastMessage, useToast } from '../../../context/ToastContext'; +import { Container } from './styles'; + +interface ToastProps { + message: ToastMessage; + style: object; +} + +const Toast: React.FC = ({ message, style }) => { + const [notRemoveToast, setNotRemoveToast] = useState(false); + const { removeToast } = useToast(); + + const icons = { + info: setNotRemoveToast(true)} />, + error: ( + setNotRemoveToast(true)} /> + ), + success: ( + setNotRemoveToast(true)} /> + ), + warn: ( + setNotRemoveToast(true)} /> + ), + }; + + useEffect(() => { + const timer = setTimeout(() => { + if (!notRemoveToast) { + removeToast(message.id); + } + }, 5000); + return () => { + clearTimeout(timer); // exclui o timer caso o componente seja destruído + }; + }, [removeToast, notRemoveToast, message.id]); + return ( + + {icons[message.type || 'info']} +
+ {message.title} +

{message?.description}

+
+ +
+ ); +}; + +export default Toast; diff --git a/frontend/src/componets/ToastContainer/Toast/styles.ts b/frontend/src/componets/ToastContainer/Toast/styles.ts new file mode 100755 index 0000000..8d40d1e --- /dev/null +++ b/frontend/src/componets/ToastContainer/Toast/styles.ts @@ -0,0 +1,74 @@ +import { animated } from 'react-spring'; +import styled, { css } from 'styled-components'; + +interface ContainerProps { + type?: 'success' | 'error' | 'info' | 'warn'; + hasDescription: boolean; +} +const toastTypeVariations = { + info: css` + background: #ebf8ff; + color: #3172b7; + `, + success: css` + background: #4caf50; + color: #fff; + `, + error: css` + background: #e65100; + color: #fff; + `, + warn: css` + background: #ff9800; + color: #fff; + `, +}; + +export const Container = animated(styled.div` + width: 360px; + position: relative; + padding: 16px 30px 16px 16px; + border-radius: 10px; + box-shadow: 2px 2px 8px rgba(0, 0, 0, 0.2); + display: flex; + z-index: 30000; + + & + div { + margin-top: 8px; + } + + ${props => toastTypeVariations[props.type || 'info']} + + > svg { + margin: 4px 12px 0 0; + cursor: pointer; + } + div { + flex: 1; + p { + margin-top: 4px; + font-size: 14px; + font-weight: bold; + opacity: 0.8; + line-height: 20px; + } + } + button { + position: absolute; + right: 10px; + top: 10px; + opacity: 0.6; + border: 0; + background: transparent; + color: inherit; + cursor: pointer; + } + ${props => + !props.hasDescription && + css` + align-items: center; + svg { + margin-top: 0; + } + `} +`); diff --git a/frontend/src/componets/ToastContainer/index.tsx b/frontend/src/componets/ToastContainer/index.tsx new file mode 100755 index 0000000..15f0089 --- /dev/null +++ b/frontend/src/componets/ToastContainer/index.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { useTransition } from 'react-spring'; + +import Toast from './Toast'; +import { Container } from './styles'; +import { ToastMessage } from '../../context/ToastContext'; + +interface ToastContainerProps { + messages: ToastMessage[]; +} + +const ToastContainer: React.FC = ({ messages }) => { + const messagesWithTransations = useTransition( + messages, + message => message.id, + { + from: { top: '-120%', opacity: 0 }, + enter: { top: '0%', opacity: 1 }, + leave: { top: '-120%', opacity: 0 }, + }, + ); + return ( + + {messagesWithTransations.map(({ item, key, props }) => ( + + ))} + + ); +}; + +export default ToastContainer; diff --git a/frontend/src/componets/ToastContainer/styles.ts b/frontend/src/componets/ToastContainer/styles.ts new file mode 100755 index 0000000..77b7d39 --- /dev/null +++ b/frontend/src/componets/ToastContainer/styles.ts @@ -0,0 +1,10 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + position: absolute; + right: calc(50% - 180px); + top: 0; + padding: 10px; + margin: 0; + overflow: hidden; +`; diff --git a/frontend/src/componets/chart/chart.tsx b/frontend/src/componets/chart/chart.tsx new file mode 100644 index 0000000..c7aeed7 --- /dev/null +++ b/frontend/src/componets/chart/chart.tsx @@ -0,0 +1,242 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import * as React from 'react'; +import { useTheme } from '@mui/material/styles'; +import am5locales_pt_BR from '@amcharts/amcharts5/locales/pt_BR'; + +import { Box, Paper, Typography } from '@mui/material'; +import { formatNumber } from '../../util/infoFormat'; +import * as am5 from '@amcharts/amcharts5'; +import * as am5xy from '@amcharts/amcharts5/xy'; +import am5themes_Animated from '@amcharts/amcharts5/themes/Animated'; + +interface Data { + data: { date: string; value: number }[]; +} + +const CustomizedLabel: React.FunctionComponent = (props: any) => { + const { x, y, stroke, value } = props; + + return ( + + {formatNumber(value)} + + ); +}; + +const CustomizedAxisTick: React.FunctionComponent = (props: any) => { + const { x, y, stroke, payload } = props; + + const value = payload.value.replace(`/${new Date().getFullYear()}`, ''); + + return ( + + + {value} + + + ); +}; + +const CustomTooltip = ({ active, payload, label }: any) => { + if (active && payload && payload.length) { + return ( + + + {label} + + R$ {formatNumber(payload[0].value)} + + + + ); + } + + return null; +}; + +const ChartComponent: React.FC = ({ data }) => { + const theme = useTheme(); + + React.useEffect(() => { + let root = am5.Root.new('chartdiv'); + root.locale = am5locales_pt_BR; + root.numberFormatter.set('numberFormat', '#,###.00'); + + if (data.length > 0) { + handleChart(data, root); + } + return () => { + root.dispose(); + }; + }, [data]); + + const handleChart = (data: any[], root: any) => { + // Set themes + // https://www.amcharts.com/docs/v5/concepts/themes/ + root.dateFormatter.set('dateFormat', 'd/MM/yyyy'); + + root.setThemes([am5themes_Animated.new(root)]); + root._logo.dispose(); + + // Create chart + // https://www.amcharts.com/docs/v5/charts/xy-chart/ + let chart = root.container.children.push( + am5xy.XYChart.new(root, { + panX: true, + panY: true, + wheelX: 'panX', + wheelY: 'zoomX', + pinchZoomX: true, + maxTooltipDistance: 0, + showTooltipOn: 'always', + }), + ); + + // Add cursor + // https://www.amcharts.com/docs/v5/charts/xy-chart/cursor/ + let cursor = chart.set( + 'cursor', + am5xy.XYCursor.new(root, { + behavior: 'none', + }), + ); + cursor.lineY.set('visible', false); + + // Create axes + // https://www.amcharts.com/docs/v5/charts/xy-chart/axes/ + let xAxis = chart.xAxes.push( + am5xy.DateAxis.new(root, { + maxDeviation: 0.2, + baseInterval: { + timeUnit: 'hour', + count: 5, + }, + start: 0.8, + dateFormatter: 'dd/MM/yyyy', + renderer: am5xy.AxisRendererX.new(root, { + strokeWidth: 2, + }), + tooltip: am5.Tooltip.new(root, {}), + }), + ); + + let yAxis = chart.yAxes.push( + am5xy.ValueAxis.new(root, { + renderer: am5xy.AxisRendererY.new(root, { + minGridDistance: 20, + }), + tooltip: am5.Tooltip.new(root, {}), + }), + ); + + // Add series + // https://www.amcharts.com/docs/v5/charts/xy-chart/series/ + let series = chart.series.push( + am5xy.LineSeries.new(root, { + name: 'Series', + xAxis: xAxis, + yAxis: yAxis, + valueYField: 'value', + valueXField: 'date', + sequencedInterpolation: true, + tooltip: am5.Tooltip.new(root, { + labelText: '{valueY}', + }), + }), + ); + + // Add scrollbar + // https://www.amcharts.com/docs/v5/charts/xy-chart/scrollbars/ + var scrollbarX = am5.Scrollbar.new(root, { + orientation: 'horizontal', + }); + + chart.set('scrollbarX', scrollbarX); + chart.bottomAxesContainer.children.push(scrollbarX); + chart.set('scrollbarX', scrollbarX); + + // Set data + // data = generateDatas(1200); + series.data.setAll(data); + + // Make stuff animate on load + // https://www.amcharts.com/docs/v5/concepts/animations/ + series.appear(1000); + chart.appear(1000, 100); + }; + + return ( + + {/* + + + } + /> + + + + } /> + + + {' '} + } /> + + + + + */} +
+
+ ); +}; + +export default ChartComponent; diff --git a/frontend/src/componets/controls/Button.js b/frontend/src/componets/controls/Button.js new file mode 100644 index 0000000..b07795a --- /dev/null +++ b/frontend/src/componets/controls/Button.js @@ -0,0 +1,30 @@ +import React from 'react' +import { Button as MuiButton, makeStyles } from "@material-ui/core"; + + +const useStyles = makeStyles(theme => ({ + root: { + margin: theme.spacing(0.5) + }, + label: { + textTransform: 'none' + } +})) + +export default function Button(props) { + + const { text, size, color, variant, onClick, ...other } = props + const classes = useStyles(); + + return ( + + {text} + + ) +} diff --git a/frontend/src/componets/controls/Input.js b/frontend/src/componets/controls/Input.js new file mode 100644 index 0000000..4e247ba --- /dev/null +++ b/frontend/src/componets/controls/Input.js @@ -0,0 +1,17 @@ +import React from 'react' +import { TextField } from '@material-ui/core'; + +export default function Input(props) { + + const { name, label, value,error=null, onChange } = props; + return ( + + ) +} diff --git a/frontend/src/componets/dialog/alertDialog.tsx b/frontend/src/componets/dialog/alertDialog.tsx new file mode 100644 index 0000000..4a08eb6 --- /dev/null +++ b/frontend/src/componets/dialog/alertDialog.tsx @@ -0,0 +1,73 @@ +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import DialogTitle from '@mui/material/DialogTitle'; +import * as React from 'react'; + +interface DialogProps { + handleConfirmation: (openDialog: boolean) => void; + open: boolean; + messageDialogTitle?: string; + handleCloseProps?: () => void; + messageDetail?: string; +} + +const AlertDialog: React.FC = ({ + handleConfirmation, + open, + messageDialogTitle, + handleCloseProps, + messageDetail, +}) => { + const handleClose = () => { + if (handleCloseProps) { + handleCloseProps(); + } else { + handleConfirmation(false); + } + }; + + const handleConfirmDeleteComponent = () => { + handleConfirmation(true); + }; + + return ( +
+ + + {messageDialogTitle || + 'Tem certeza que deseja excluir o registro?'} + + + + + + + + + +
+ ); +}; + +export default AlertDialog; diff --git a/frontend/src/componets/filter/filterSearch.scss b/frontend/src/componets/filter/filterSearch.scss new file mode 100644 index 0000000..e401968 --- /dev/null +++ b/frontend/src/componets/filter/filterSearch.scss @@ -0,0 +1,28 @@ +.container-search { + background-color: #fff; + color: rgba(0, 0, 0, 0.87); + transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + box-shadow: 0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12); + overflow-y: auto; + display: flex; + flex-direction: column; + height: 100%; + flex: 1 0 auto; + z-index: 1100; + position: fixed; + top: 0; + outline: 0; + right: 0; + width: 300px; + + .container-inputs { + display: block; + width: 100%; + margin-top: 8px; + padding: 8px; + } +} + +.container-search-none { + display: none; +} \ No newline at end of file diff --git a/frontend/src/componets/filter/filterSearch.tsx b/frontend/src/componets/filter/filterSearch.tsx new file mode 100644 index 0000000..1d6c77f --- /dev/null +++ b/frontend/src/componets/filter/filterSearch.tsx @@ -0,0 +1,188 @@ +import CloseIcon from '@mui/icons-material/Close'; +import { Container, IconButton, Stack, Typography } from '@mui/material'; +import React, { useEffect, useState, useLayoutEffect } from 'react'; +import api from '../../services/api'; +import { FormAutocompleteInitialized } from '../form/formAutocompleteInitialized'; +import { FormAutocompleteMultiple } from '../form/formAutocompleteMultiple'; +import { FormButton } from '../form/formButton'; +import { FormInputText, IFormInputProps } from '../form/formInputText'; +import './filterSearch.scss'; +import QueryStringGlobal from '../queryStringGlobal'; +import { objToQuery, setValuesOfQuery } from '../../util/query'; +import { useHistory } from 'react-router-dom'; +import { IFormInputPropsFilter } from '../interfaces/formInputPropsFilter'; +import GlobalQueryString from '../globalQueryString'; + +interface IFilterSearch { + inputs: IFormInputPropsFilter[]; + handleClearFilters?: () => void; + setToggleSearch: (toggleSearch: boolean) => void; + toggleSearch: boolean; + setRowsPerPage: (numb: number) => void; + setPage: (numb: number) => void; + rowsPerPage: number; + page: number; + implementationLoadRows: (queryString: string) => Promise; + updateRows: boolean; + setUpdateRows: (action: boolean) => void; + queryDefault: string; +} + +const FilterSearchComponent: React.FC = ({ + inputs, + setToggleSearch, + toggleSearch, + setRowsPerPage, + setPage, + rowsPerPage, + page, + implementationLoadRows, + updateRows, + setUpdateRows, + queryDefault, +}) => { + const history = useHistory(); + + const data: any = { charCode: 13 }; + + function handleClearAll() { + history.push(`?${queryDefault}`); + setValuesOfQuery(queryDefault, inputs, setRowsPerPage, setPage); + implementationLoadRows(queryDefault); + } + + return ( +
+ + {/** INPUT FILTERS */} + {toggleSearch && ( +
+ + + Filtros + + + { + setToggleSearch(false); + }}> + + + + + + {inputs.map((input, index) => { + if (input.typeInput === 'text') { + return ( + + ); + } + if (input.typeInput === 'autocomplete') { + return ( + + ); + } + if ( + input.typeInput === 'multiple' && + input.getValues + ) { + return ( + + ); + } + return <>; + })} + + + {window.screen.width < 800 && + inputs[0]?.handleOnKeyPress && ( + + inputs[0]?.handleOnKeyPress?.(data) + } + /> + )} + + + +
+ )} +
+ ); +}; + +export default FilterSearchComponent; diff --git a/frontend/src/componets/filterBackup/filterSearch.scss b/frontend/src/componets/filterBackup/filterSearch.scss new file mode 100644 index 0000000..e401968 --- /dev/null +++ b/frontend/src/componets/filterBackup/filterSearch.scss @@ -0,0 +1,28 @@ +.container-search { + background-color: #fff; + color: rgba(0, 0, 0, 0.87); + transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + box-shadow: 0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12); + overflow-y: auto; + display: flex; + flex-direction: column; + height: 100%; + flex: 1 0 auto; + z-index: 1100; + position: fixed; + top: 0; + outline: 0; + right: 0; + width: 300px; + + .container-inputs { + display: block; + width: 100%; + margin-top: 8px; + padding: 8px; + } +} + +.container-search-none { + display: none; +} \ No newline at end of file diff --git a/frontend/src/componets/filterBackup/filterSearch.tsx b/frontend/src/componets/filterBackup/filterSearch.tsx new file mode 100644 index 0000000..5041029 --- /dev/null +++ b/frontend/src/componets/filterBackup/filterSearch.tsx @@ -0,0 +1,230 @@ +// import CloseIcon from '@mui/icons-material/Close'; +// import { Container, IconButton, Stack, Typography } from '@mui/material'; +// import React, { useEffect, useState, useLayoutEffect } from 'react'; +// import api from '../../services/api'; +// import { FormAutocompleteInitialized } from '../form/formAutocompleteInitialized'; +// import { FormAutocompleteMultiple } from '../form/formAutocompleteMultiple'; +// import { FormButton } from '../form/formButton'; +// import { FormInputText, IFormInputProps } from '../form/formInputText'; +// import './filterSearch.scss'; +// import QueryStringGlobal from '../queryStringGlobal'; +// import { objToQuery } from '../../util/query'; +// import { useHistory } from 'react-router-dom'; + +// export interface IFormInputPropsFilter extends IFormInputProps { +// typeInput: 'text' | 'date' | 'autocomplete' | 'multiple'; +// mask?: +// | 'phone' +// | 'number' +// | 'identification' +// | 'cep' +// | 'toUpperCase' +// | undefined; +// loadingAutocomplete?: boolean; +// options?: any[]; +// setValue?: any; +// getValues?: (name: string) => any | any[] | undefined; +// query?: string; +// handleChange?: any; +// handleOnKeyPress?: (data: any, input?: string) => void; +// } + +// interface IValueToBeHeart { +// keyParam: string; +// defaultValue: any; +// implementation: (value: any) => void; +// implementationClear: () => void; +// } + +// interface IFilterSearch { +// inputs: IFormInputPropsFilter[]; +// handleClearFilters?: () => void; +// setToggleSearch: (toggleSearch: boolean) => void; +// toggleSearch?: boolean; +// setRowsPerPage?: (numb: number) => void; +// setPage?: (numb: number) => void; +// rowsPerPage?: number; +// page?: number; +// initialValues?: any; +// implementationLoadRows?: (queryString: string) => Promise; +// valuesToBeHeart?: IValueToBeHeart[]; +// loadRows?: boolean; +// } + +// const FilterSearch: React.FC = ({ +// inputs, +// setToggleSearch, +// toggleSearch, +// setRowsPerPage, +// setPage, +// rowsPerPage, +// page, +// initialValues, +// implementationLoadRows, +// valuesToBeHeart, +// loadRows, +// }) => { +// const history = useHistory(); + +// const data: any = { charCode: 13 }; + +// function handleClearAll() { +// let paramsQueryString: any = {}; +// if (valuesToBeHeart) { +// for (const valueToBeHeart of valuesToBeHeart) { +// valueToBeHeart.implementationClear(); +// paramsQueryString = { +// ...paramsQueryString, +// [valueToBeHeart.keyParam]: valueToBeHeart.defaultValue, +// }; +// } + +// // setQuery(objToQuery(paramsQueryString)); +// history.push(`?${objToQuery(paramsQueryString)}`); +// } +// } + +// return ( +//
+// {setRowsPerPage && +// setPage && +// (rowsPerPage || rowsPerPage === 0) && +// (page || page === 0) && +// initialValues && +// implementationLoadRows && +// valuesToBeHeart && +// (loadRows === true || loadRows === false) ? ( +// +// ) : ( +// '' +// )} +// {/** INPUT FILTERS */} +// {toggleSearch && ( +//
+// +// +// Filtros +// +// +// { +// setToggleSearch(false); +// }}> +// +// +// +// +// +// {inputs.map((input, index) => { +// if (input.typeInput === 'text') { +// return ( +// +// ); +// } +// if (input.typeInput === 'autocomplete') { +// return ( +// +// ); +// } +// if ( +// input.typeInput === 'multiple' && +// input.getValues +// ) { +// return ( +// +// ); +// } +// return <>; +// })} +// +// +// {window.screen.width < 800 && +// inputs[0]?.handleOnKeyPress && ( +// +// inputs[0]?.handleOnKeyPress?.(data) +// } +// /> +// )} +// +// +// +//
+// )} +//
+// ); +// }; + +export default <>; diff --git a/frontend/src/componets/filterComponent/filterSearch.scss b/frontend/src/componets/filterComponent/filterSearch.scss new file mode 100644 index 0000000..e401968 --- /dev/null +++ b/frontend/src/componets/filterComponent/filterSearch.scss @@ -0,0 +1,28 @@ +.container-search { + background-color: #fff; + color: rgba(0, 0, 0, 0.87); + transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + box-shadow: 0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12); + overflow-y: auto; + display: flex; + flex-direction: column; + height: 100%; + flex: 1 0 auto; + z-index: 1100; + position: fixed; + top: 0; + outline: 0; + right: 0; + width: 300px; + + .container-inputs { + display: block; + width: 100%; + margin-top: 8px; + padding: 8px; + } +} + +.container-search-none { + display: none; +} \ No newline at end of file diff --git a/frontend/src/componets/filterComponent/filterSearch.tsx b/frontend/src/componets/filterComponent/filterSearch.tsx new file mode 100644 index 0000000..04e569e --- /dev/null +++ b/frontend/src/componets/filterComponent/filterSearch.tsx @@ -0,0 +1,192 @@ +import CloseIcon from '@mui/icons-material/Close'; +import { IconButton, Stack, Typography } from '@mui/material'; +import { FormAutocompleteInitialized } from '../form/formAutocompleteInitialized'; +import { FormAutocompleteMultiple } from '../form/formAutocompleteMultiple'; +import { FormButton } from '../form/formButton'; +import { FormInputText, IFormInputProps } from '../form/formInputText'; +import './filterSearch.scss'; +import { setValuesOfQuery } from '../../util/query'; +import { useHistory } from 'react-router-dom'; +import GlobalQueryString from '../globalQueryString'; +import { IFormInputPropsFilter } from '../interfaces/formInputPropsFilter'; + +interface IFilterSearch { + inputs: IFormInputPropsFilter[]; + handleInputs?: IFormInputPropsFilter[]; + handleClearFilters?: () => void; + setToggleSearch: (toggleSearch: boolean) => void; + toggleSearch: boolean; + setRowsPerPage: (numb: number) => void; + setPage: (numb: number) => void; + rowsPerPage: number; + page: number; + implementationLoadRows: (queryString: string) => Promise; + updateRows: boolean; + setUpdateRows: (action: boolean) => void; + queryDefault: string; +} + +const GlobalFilterSearchComponent: React.FC = ({ + inputs, + setToggleSearch, + toggleSearch, + setRowsPerPage, + setPage, + rowsPerPage, + page, + implementationLoadRows, + updateRows, + setUpdateRows, + queryDefault, + handleInputs, +}) => { + const history = useHistory(); + + const data: any = { charCode: 13 }; + + let inputsFilter = [...inputs]; + if (handleInputs) { + inputsFilter = [...handleInputs]; + } + + function handleClearAll() { + history.push(`?${queryDefault}`); + setValuesOfQuery(queryDefault, inputs, setRowsPerPage, setPage); + implementationLoadRows(queryDefault); + } + + return ( +
+ + {/** INPUT FILTERS */} + {toggleSearch && ( +
+ + + Filtros + + + { + setToggleSearch(false); + }}> + + + + + + {inputsFilter.map((input, index) => { + if (input.typeInput === 'text') { + return ( + + ); + } + if (input.typeInput === 'autocomplete') { + return ( + + ); + } + if ( + input.typeInput === 'multiple' && + input.getValues + ) { + return ( + + ); + } + return <>; + })} + + + {window.screen.width < 800 && + inputs[0]?.handleOnKeyPress && ( + + inputs[0]?.handleOnKeyPress?.(data) + } + /> + )} + + + +
+ )} +
+ ); +}; + +export default GlobalFilterSearchComponent; diff --git a/frontend/src/componets/footer/index.tsx b/frontend/src/componets/footer/index.tsx new file mode 100644 index 0000000..31a6d03 --- /dev/null +++ b/frontend/src/componets/footer/index.tsx @@ -0,0 +1,20 @@ +import { Typography } from '@mui/material'; + +import './styles.scss'; +import { texts } from '../../config'; + +export default function Footer(props: any) { + return ( +
+ + {`Copyright © ${texts.nameSystem} `} + {new Date().getFullYear()} + {'.'} + +
+ ); +} diff --git a/frontend/src/componets/footer/styles.scss b/frontend/src/componets/footer/styles.scss new file mode 100644 index 0000000..bf215f6 --- /dev/null +++ b/frontend/src/componets/footer/styles.scss @@ -0,0 +1,8 @@ +.container-footer { + // background-color:#e0e0e0; + // flex-shrink: 0; + height: 40px; + display: flex; + justify-content: center; + align-items: center; +} \ No newline at end of file diff --git a/frontend/src/componets/form/MaskInput.tsx b/frontend/src/componets/form/MaskInput.tsx new file mode 100644 index 0000000..594ed8c --- /dev/null +++ b/frontend/src/componets/form/MaskInput.tsx @@ -0,0 +1,63 @@ +import React, { useState, ChangeEvent } from 'react'; +import { TextField } from '@mui/material'; + +const MaskedInput: React.FC = () => { + const [value, setValue] = useState(''); + const [cursorPosition, setCursorPosition] = useState(null); + + const handleChange = (event: ChangeEvent) => { + // Obtém o valor do campo de entrada + let inputValue = event.target.value; + + // Salva a posição do cursor antes da mudança + const selectionStart = event.target.selectionStart; + + // Remove caracteres que não são números + inputValue = inputValue.replace(/\D/g, ''); + + // Adiciona underline para os próximos dígitos + let maskedValue = ''; + let i = 0; + for (i = 0; i < inputValue.length && i < 3; i++) { + maskedValue += inputValue[i]; + } + for (; i < 3; i++) { + maskedValue += '_'; + } + maskedValue += ','; + + for (; i < inputValue.length && i < 6; i++) { + maskedValue += inputValue[i]; + } + for (; i < 6; i++) { + maskedValue += '_'; + } + + // Atualiza o estado com o valor mascarado + setValue(maskedValue); + + // Salva a posição do cursor para restaurá-la após a mudança + setCursorPosition(selectionStart); + }; + + return ( + + input && + cursorPosition !== null && + input.setSelectionRange(cursorPosition, cursorPosition), + }} // Limita o comprimento total do valor + /> + ); +}; + +export default MaskedInput; diff --git a/frontend/src/componets/form/exampleUseMaskFormInputText.tsx b/frontend/src/componets/form/exampleUseMaskFormInputText.tsx new file mode 100644 index 0000000..33a2b35 --- /dev/null +++ b/frontend/src/componets/form/exampleUseMaskFormInputText.tsx @@ -0,0 +1,329 @@ +import { IconButton, InputProps, TextField, Tooltip } from '@mui/material'; +import { Controller } from 'react-hook-form'; +import { randomId } from '../../util/randomIdInput'; +import { cepMask } from './mask/cep'; +import { cpfAndCnpjMask } from './mask/cpfAndCnpj'; +import { numberMask } from './mask/number'; +import { + configMaskPhone, + phoneMask, + phoneMaskTes3, + phoneMaskTest, +} from './mask/exampleGenericMask'; +import { toUpperCaseMask } from './mask/toUpperCase'; +import { handleMessageError } from '../../util/handleMessages'; +import { IButtonProps, IconComponent } from '../icons'; +import { ChangeEvent, useState } from 'react'; +import { IConfig, configAllSetNewValue, genericMask } from './mask/genericMask'; + +export interface IFormInputProps extends InputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; + handleOnBlur?: (data: any) => void; + ref?: any; + autoFocus?: boolean; + readOnly?: boolean; + size?: 'small' | 'medium' | undefined; + sx?: any; + type?: any; + multiline?: boolean; + mask?: + | 'phone' + | 'number' + | 'identification' + | 'cep' + | 'toUpperCase' + | undefined; + hidden?: boolean; + inactiveRandomId?: boolean; + messagesError?: { type: string; message: string }[]; + actionOnInput?: { + action: () => void; + iconProps: IButtonProps; + textTooltip: string; + }; + activeDebounce?: boolean; + setValue?: (key: string, value: any) => void; + setError?: (field: any, customError: any) => void; + clearErrors?: (field: any) => void; + id?: string; +} + +export const execMask = ( + mask: string, + event: ChangeEvent, + onBlur: boolean, +) => { + const value = event?.target?.value; + switch (mask) { + case 'phone': + return phoneMask(value, onBlur, event); + case 'number': + return numberMask(value); + case 'identification': + return cpfAndCnpjMask(value, onBlur); + case 'cep': + return cepMask(value, onBlur); + case 'toUpperCase': + return toUpperCaseMask(value, onBlur); + + default: + return ''; + } +}; + +export const FormInputText = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnKeyPress, + autoFocus, + readOnly, + size, + sx, + type, + multiline, + mask, + handleOnBlur, + inactiveRandomId, + messagesError, + actionOnInput, + setValue, + id: idInput, + defaultValue, +}: IFormInputProps) => { + const [config, setConfig] = useState( + configMaskPhone.filter(c => c.type !== 'optional'), + ); + if (!variant) { + variant = 'outlined'; + } + + let id = name; + if (!inactiveRandomId) { + id = randomId(name); + } + if (idInput) { + id = idInput; + } + + return ( +
+ { + if (multiline) { + return ( + { + input && autoFocus && input.focus(); + }} + helperText={ + messageError && messageError(error, name) + } + error={!!error} + size={size || 'small'} + onChange={event => { + onChange(event); + handleChange && handleChange(event); + }} + onKeyPress={(data: any) => { + handleOnKeyPress && handleOnKeyPress(data); + }} + onBlur={(data: any) => { + handleOnBlur && handleOnBlur(data); + }} + value={value || ''} + fullWidth + label={label} + variant={variant} + /> + ); + } + + return ( + { + input && autoFocus && input.focus(); + }} + helperText={handleMessageError( + messageError, + messagesError, + error, + name, + )} + error={!!error} + size={size || 'small'} + onChange={(event: any) => { + if (mask && event.target.value) { + const { selectionStart } = event.target; + const valueSplitted = + event.target.value.split(''); + const key = + event?.target?.keyPress === 'Backspace' + ? event.target.keyPress + : valueSplitted[selectionStart - 1]; + + if ( + event?.target?.keyPress !== + 'Backspace' && + event?.target?.keyPress !== + 'InvalidKey' && + event.currentTarget.defaultValue + ) { + const currentValueSplitted = + event.currentTarget.defaultValue.split( + '', + ); + currentValueSplitted[ + selectionStart - 1 + ] = key; + + event.target.value = + currentValueSplitted.join(''); + + event.target.value = + configAllSetNewValue({ + configMask: config, + event, + }); + event.target.selectionStart = + selectionStart; + event.target.selectionEnd = + selectionStart; + + event.target.selectionStart = + selectionStart; + event.target.selectionEnd = + selectionStart; + } + + if ( + event?.target?.keyPress === 'Backspace' + ) { + const currentValueSplitted = + event.currentTarget.defaultValue.split( + '', + ); + currentValueSplitted[selectionStart] = + '_'; + event.target.value = + currentValueSplitted.join(''); + + event.target.selectionStart = + selectionStart; + event.target.selectionEnd = + selectionStart; + } + } + onChange(event); + if (event.target.value != value && setValue) { + setValue(name, event.target.value); + } + handleChange && handleChange(event); + }} + onKeyPress={(event: any) => { + handleOnKeyPress && handleOnKeyPress(event); + }} + onKeyDown={(event: any) => { + if (mask) { + event.target.keyPress = ''; + if (event?.code === 'Backspace') { + event.target.keyPress = 'Backspace'; + } + + const result = genericMask( + event.target.value, + false, + event, + setConfig, + config, + ); + + if (result.action === 'InvalidKey') { + event.preventDefault(); // Impede o comportamento padrão da tecla (se houver) + event.stopPropagation(); + } + + if (result?.selectionStart) { + event.target.selectionStart = + result.selectionStart; + event.target.selectionEnd = + result.selectionStart; + } + } + }} + onBlur={(event: any) => { + if (mask && event.target.value) { + // event.target.value = execMask( + // mask, + // event.target.value, + // true, + // ); + // onChange(event); + } + handleOnBlur && handleOnBlur(event); + }} + value={value || ''} + fullWidth + label={label} + variant={variant} + /> + ); + }} + /> + {actionOnInput && ( + actionOnInput.action()}> + actionOnInput.action()}> + + + + )} +
+ ); +}; diff --git a/frontend/src/componets/form/formAutocompleteInitialized.tsx b/frontend/src/componets/form/formAutocompleteInitialized.tsx new file mode 100644 index 0000000..cbb77ef --- /dev/null +++ b/frontend/src/componets/form/formAutocompleteInitialized.tsx @@ -0,0 +1,628 @@ +import * as React from 'react'; +import { + Autocomplete, + CircularProgress, + createFilterOptions, + Dialog, + DialogContent, + DialogTitle, + Grid, + IconButton, + Stack, + TextField, + Tooltip, +} from '@mui/material'; +import debounce from 'lodash/debounce'; +import { useMemo } from 'react'; +import { Controller } from 'react-hook-form'; +import { extraValidationCNPJ } from '../../communs/validations/cnpj'; +import { extraValidationCPF } from '../../communs/validations/cpf'; +import { cpfAndCnpjMask } from './mask/cpfAndCnpj'; +import { FormInputText } from '../form/formInputText'; +import { FormButton } from './formButton'; +import { InputPropsToForm } from './formInterfaces'; +import { handleMessageError, message } from '../../util/handleMessages'; +import { IButtonProps, IconComponent } from '../icons'; +import api from '../../services/api'; +import { handleExceptionMessage } from '../../util/handleExceptionAxios'; +import { useToast } from '../../context/ToastContext'; + +// interface FormInputProps extends IInputProps { +// typeInput: 'text' | 'date' | 'autocomplete'; +// mask?: +// | 'phone' +// | 'number' +// | 'identification' +// | 'cep' +// | 'toUpperCase' +// | undefined; +// setError?: any; +// clearErrors?: any; +// required: boolean; +// options?: { +// name?: string; +// description?: string; +// id?: string; +// code?: string; +// }[]; +// setValue?: any; +// setFocusFirstField?: (value: boolean) => void; +// } + +export interface IFormInputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; + handleOnBlur?: (data: any) => void; + options: { + name?: string; + description?: string; + id?: string; + code?: string; + }[]; + setValue: any; + autoFocus?: boolean; + activeDebounce?: boolean; + loading: boolean; + mask?: 'identification' | 'toUpperCase' | undefined; + multiple?: boolean; + setValueSave?: any; + getValuesSave?: (value: string) => any; + arrInput?: InputPropsToForm[]; + actionSave?: () => any; + setErrorSave?: any; + clearErrorsSave?: any; + dialogTitle?: string; + readOnly?: boolean; + messagesError?: { type: string; message: string }[]; + actionOnInput?: { + action: () => void; + iconProps: IButtonProps; + textTooltip: string; + }; + query?: (value: string) => string; +} + +interface IDialogSave { + open: boolean; + toggleOpen: (open: boolean) => void; + setValueSave?: any; + getValuesSave?: (value: string) => any; + arrInput?: InputPropsToForm[]; + actionSave?: () => any; + setErrorSave?: any; + clearErrorsSave?: any; + setValue: any; + name: string; + dialogTitle?: string; +} + +const execMask = (mask: string, value: string, onBlur: boolean) => { + switch (mask) { + case 'identification': + return cpfAndCnpjMask(value, onBlur); + + default: + return ''; + } +}; + +export const FormAutocompleteInitialized = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnKeyPress, + handleOnBlur, + options, + setValue, + autoFocus, + activeDebounce, + loading, + mask, + multiple, + setValueSave, + getValuesSave, + arrInput, + actionSave, + dialogTitle, + readOnly, + messagesError, + actionOnInput, + query, +}: IFormInputProps) => { + const [open, toggleOpen] = React.useState(false); + const [controlOptionAdd, setControlOptionAdd] = React.useState(false); + const [controlFreeSolo, setControlFreeSolo] = React.useState(true); + const [optionsAutocomplete, setOptionsAutocomplete] = React.useState([]); + const [load, setLoad] = React.useState(false); + + const { addToast } = useToast(); + + const handleSetValuesSave = (name: string, value: any) => { + if (arrInput && arrInput?.length > 0) { + for (let key in arrInput) { + const inputSave = arrInput[key]; + if (inputSave.name == name) { + setValueSave(inputSave.name, value); + return; + } + } + } + }; + + const updateAutocomplete = async ({ + description, + }: { + description: string; + }) => { + if (description && description.length > 0 && query) { + try { + setLoad(true); + const response = await api.get(query(description)); + setOptionsAutocomplete(response.data.content); + } catch (error) { + const messagesResponse = handleExceptionMessage(error); + addToast({ + type: 'error', + title: message.error.selectAll, + description: messagesResponse, + }); + } + setLoad(false); + } + }; + + if (!variant) { + variant = 'outlined'; + } + + const handleOnChange = (event: React.ChangeEvent) => { + let valid = true; + // Se não atender a validação nem vai fazer a pesquisa, porque é através do handleChange que é feita uma nova pesquisa para atualizar as options + if ( + mask && + mask == 'identification' && + event.target.value.replace(/\D/g, '').length >= 2 && + event.target.value.includes('.') + ) { + valid = + extraValidationCNPJ(event.target.value) && + extraValidationCPF(event.target.value); + } + valid && handleChange && handleChange(event); + setControlOptionAdd(true); + + if (event.target.value && event.target.value.length > 0 && query) { + updateAutocomplete({ description: event.target.value }); + } + }; + + const debouncedChangeHandler = useMemo( + () => debounce(handleOnChange, activeDebounce ? 700 : 0), + [], + ); + + const filter = createFilterOptions(); + + const isLoading = () => { + return loading || load; + }; + + return ( +
+ { + return ( + + option?.description || option?.name || '' + } + freeSolo={controlFreeSolo} + onChange={(event, option) => { + if ( + option && + option.inputValue && + arrInput && + arrInput.length > 0 + ) { + toggleOpen(true); + + let inputValue = option.inputValue; + if (mask == 'toUpperCase') { + inputValue = inputValue.toUpperCase(); + } + handleSetValuesSave( + arrInput[0].name, + inputValue, + ); + } else { + onChange(event); + setValue(name, option); + handleChange && + handleChange(event, option, name); + } + }} + onKeyPress={(data: any) => { + if (controlFreeSolo && data.target) { + setControlFreeSolo(false); + } + handleOnKeyPress && handleOnKeyPress(data); + }} + onBlur={(data: any) => { + handleOnBlur && handleOnBlur(data); + }} + loading={isLoading()} + noOptionsText="Nenhum registro encontrado" + value={value || ''} + fullWidth + filterOptions={(options, params) => { + const filtered = filter(options, params); + + if ( + options.length === 0 && + params.inputValue?.length > 0 && + getValuesSave && + !isLoading() && + controlOptionAdd + ) { + filtered.push({ + inputValue: params.inputValue, + description: `Adicionar ${params.inputValue}`, + }); + return filtered; + } + + // Se o activeDebounce ser true quer dizer que está sendo feito uma pesquisa no banco de dados, então as options tem que ser filtradas lá e não no componente + if (activeDebounce) { + return options; + } + return filtered; + }} + loadingText={ + + } + renderOption={(props, option) => { + return ( +
  • + {option.descriptionComplete || + option.description || + option.name} +
  • + ); + }} + renderInput={params => { + return ( + + input && autoFocus && input.focus() + } + inputProps={{ + ...params.inputProps, + placeholder: 'Pesquise', + }} + helperText={handleMessageError( + messageError, + messagesError, + error, + name, + )} + size="small" + label={label} + variant={variant} + error={!!error} + name={name} + onChange={debouncedChangeHandler} + onKeyUp={event => { + if (mask) { + const element = + event.target as HTMLInputElement; + // Se identificar que foi iniciado a digitação de um cpf/cnpj, aí sim aplica a máscara + if ( + element.value && + element.value.replace( + /\D/g, + '', + ).length >= 2 + ) { + element.value = execMask( + mask, + element.value, + false, + ); + } + } + }} + InputProps={{ + ...params.InputProps, + endAdornment: ( + + {isLoading() && + params.inputProps[ + 'aria-expanded' + ] ? ( + + ) : null} + { + params.InputProps + .endAdornment + } + + ), + }} + /> + ); + }} + /> + ); + }} + /> + + {actionOnInput && ( + actionOnInput.action()}> + actionOnInput.action()}> + + + + )} +
    + ); +}; + +const DialogSave: React.FC = ({ + open, + toggleOpen, + arrInput, + getValuesSave, + actionSave, + setValue, + name, + dialogTitle, +}) => { + const handleClose = () => { + toggleOpen(false); + }; + + const handleSubmit = async () => { + let validFieds = true; + if (arrInput && arrInput?.length > 0) { + for (let key in arrInput) { + const inputSave = arrInput[key]; + if ( + inputSave && + !inputSave?.readOnly && + inputSave.required && + getValuesSave && + (!getValuesSave(inputSave.name) || + String(getValuesSave(inputSave.name)).length == 0) + ) { + inputSave.setError && + inputSave.setError(inputSave.name, { + type: `custom_${inputSave.name}`, + message: 'O campo é obrigatório', + }); + + validFieds = false; + return; + } else { + inputSave.clearErrors(inputSave.name); + } + } + } + if (!validFieds) { + return; + } + const data = actionSave && (await actionSave()); + setValue(name, { + description: data.description, + id: data.id, + }); + handleClose(); + }; + + const handleOnKeyPressSave = (data: any) => { + if (data.charCode === 13) { + handleSubmit(); + } + }; + + const onChangeInputSave = async ( + event: React.ChangeEvent, + name: string, + ) => { + if (arrInput && arrInput?.length > 0) { + for (let key in arrInput) { + const inputSave = arrInput[key]; + if (inputSave.name == name) { + inputSave && + inputSave.clearErrors && + event.target.value && + event.target.value.length > 0 && + inputSave.clearErrors(name); + return; + } + } + } + }; + + const onChangeInputSaveEvent = async ( + event: React.ChangeEvent, + ) => { + if (arrInput && arrInput?.length > 0) { + for (let key in arrInput) { + const inputSave = arrInput[key]; + if (inputSave.name == name) { + inputSave && + inputSave.clearErrors && + event.target.value && + event.target.value.length > 0 && + inputSave.clearErrors(name); + return; + } + } + } + }; + + return ( + + {dialogTitle} + + {/* Adicionar marca */} + + {arrInput && + arrInput.map((inputSave, index) => { + if (!inputSave.hidden) { + return ( + + {inputSave && + inputSave.typeInput == 'text' && ( + <> + { + inputSave.setFocusFirstField && + inputSave.setFocusFirstField( + false, + ); + }} + mask={inputSave.mask} + handleChange={( + event: React.ChangeEvent, + ) => + onChangeInputSave( + event, + inputSave.name, + ) + } + /> + + )} + {inputSave && + inputSave.typeInput == + 'autocomplete' && + inputSave.options && + inputSave.setValue && ( + <> + { + inputSave.setFocusFirstField && + inputSave.setFocusFirstField( + false, + ); + }} + /> + + )} + + ); + } + return <>; + })} + + {/* + setDialogValue({ + ...dialogValue, + description: event.target.value, + }) + } + label="Descrição" + type="text" + variant="standard" + /> */} + + + + handleClose()} + /> + + + + ); +}; diff --git a/frontend/src/componets/form/formAutocompleteMultiple.tsx b/frontend/src/componets/form/formAutocompleteMultiple.tsx new file mode 100644 index 0000000..3d9edef --- /dev/null +++ b/frontend/src/componets/form/formAutocompleteMultiple.tsx @@ -0,0 +1,172 @@ +import * as React from 'react'; +import { Autocomplete, TextField } from '@mui/material'; +import { Controller } from 'react-hook-form'; +import { handleMessageError, message } from '../../util/handleMessages'; +import { useMemo } from 'react'; +import { debounce } from 'lodash'; +import api from '../../services/api'; +import { useToast } from '../../context/ToastContext'; +import { handleExceptionMessage } from '../../util/handleExceptionAxios'; + +export interface IFormInputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; + handleOnBlur?: (data: any) => void; + options: { + description: string; + id: string; + }[]; + setValue: any; + getValues?: (name: string) => any | any[] | undefined; + readOnly?: boolean; + messagesError?: { type: string; message: string }[]; + activeDebounce?: boolean; + query?: (value: string) => string; + DAODataList?: (value: any) => any; +} + +export const FormAutocompleteMultiple = ({ + variant, + name, + control, + rules, + label, + messageError, + options, + setValue, + getValues, + handleChange, + readOnly, + messagesError, + activeDebounce, + query, + DAODataList, +}: IFormInputProps) => { + const [optionsAutocomplete, setOptionsAutocomplete] = React.useState([]); + + const { addToast } = useToast(); + + if (!variant) { + variant = 'outlined'; + } + + const handleValue = ({ value }: { value: any }) => { + const refOptions = query ? optionsAutocomplete : options; + + if (value) { + return refOptions.filter(o => + value.map((v: any) => v.id).includes(o.id), + ); + } + return []; + }; + + const updateAutocomplete = async ({ limit }: { limit: string }) => { + if (query) { + try { + const response = await api.get(query(limit)); + let data = response.data.data; + if (DAODataList) { + data = data.map((d: any) => DAODataList(d)); + } + setOptionsAutocomplete(data); + } catch (error) { + const messagesResponse = handleExceptionMessage(error); + addToast({ + type: 'error', + title: message.error.selectAll, + description: messagesResponse, + }); + } + } + }; + + React.useLayoutEffect(() => { + updateAutocomplete({ limit: '20' }); + }, []); + + const handleOnChange = (event: React.ChangeEvent) => { + handleChange && handleChange(event); + + // if (event.type === 'click' || event.type === 'keydown') { + // handleByOnKeyPressEnterNewQuery(false); + // } + }; + + const debouncedChangeHandler = useMemo( + () => debounce(handleOnChange, activeDebounce ? 700 : 0), + [], + ); + + return ( + { + if (!value) { + value = []; + } + return ( + + value.find((o: any) => o.id == option.id)?.id + ? true + : false + } + onChange={(event, option) => { + // const lastOption = option[option.length - 1]; + // const findOptions = option.find( + // (o, index) => + // index != option.length - 1 && + // o.description === lastOption.description, + // ); + // if (findOptions) { + // option.splice(option.length - 1, 1); + // } + onChange(event); + setValue(name, [...option]); + handleChange && handleChange(event, option); + }} + value={handleValue({ value })} + getOptionLabel={option => option.description} + size="small" + noOptionsText="Nenhum registro encontrado" + renderInput={params => ( + + )} + /> + ); + }} + /> + ); +}; diff --git a/frontend/src/componets/form/formButton.tsx b/frontend/src/componets/form/formButton.tsx new file mode 100644 index 0000000..5ba466a --- /dev/null +++ b/frontend/src/componets/form/formButton.tsx @@ -0,0 +1,140 @@ +import { + AddCircle, + CancelPresentation, + ClearAll, + Cached, +} from '@mui/icons-material'; +import DeleteIcon from '@mui/icons-material/Delete'; +import SaveIcon from '@mui/icons-material/Save'; +import SearchOutlinedIcon from '@mui/icons-material/SearchOutlined'; +import { Button, ButtonProps, SvgIconProps } from '@mui/material'; +import React from 'react'; + +interface IButtonProps extends ButtonProps { + label: string; + typeButton?: + | 'delete' + | 'submit' + | 'cancel' + | 'addRegister' + | 'search' + | 'clear' + | 'toLoad' + | 'custom'; + icon?: React.ReactElement; +} + +const removePropertyTypeButton = (properties: IButtonProps) => { + const newProperties = { ...properties }; + delete newProperties.typeButton; + return newProperties; +}; + +export const FormButton = React.forwardRef( + (buttonProps, ref) => { + const properties = removePropertyTypeButton(buttonProps); + if (buttonProps.typeButton === 'cancel') { + return ( + + ); + } + + if (buttonProps.typeButton === 'delete') { + return ( + + ); + } + + if (buttonProps.typeButton === 'submit') { + let buttonIcon = ; + if (buttonProps.icon) { + buttonIcon = buttonProps.icon; + } + return ( + + ); + } + + if (buttonProps.typeButton === 'addRegister') { + return ( + + ); + } + + if (buttonProps.typeButton === 'search') { + return ( + + ); + } + if (buttonProps.typeButton === 'clear') { + return ( + + ); + } + if (buttonProps.typeButton === 'toLoad') { + return ( + + ); + } + if (buttonProps.typeButton === 'custom') { + return ( + + ); + } + return <>; + }, +); diff --git a/frontend/src/componets/form/formCheckbox.tsx b/frontend/src/componets/form/formCheckbox.tsx new file mode 100644 index 0000000..3ca957b --- /dev/null +++ b/frontend/src/componets/form/formCheckbox.tsx @@ -0,0 +1,57 @@ +import { FormControlLabel } from '@mui/material'; +import Checkbox from '@mui/material/Checkbox'; +import { Controller } from 'react-hook-form'; + +const labelProps = { inputProps: { 'aria-label': 'Checkbox demo' } }; + +interface IFormInputProps { + name: string; + control: any; +} + +export const FormCheckbox = ({ name, control }: IFormInputProps) => { + return ( + { + return ( + { + onChange(event); + }} + /> + ); + }} + /> + ); +}; + +// Outra implementação que também funciona +// export const FormCheckbox = ({ name, control }: IFormInputProps) => { +// return ( +// ( +// props.onChange(e.target.checked)} +// /> +// )} +// /> +// } +// label={'label'} +// /> +// ); +// }; diff --git a/frontend/src/componets/form/formComplete/index.tsx b/frontend/src/componets/form/formComplete/index.tsx new file mode 100644 index 0000000..ac365ff --- /dev/null +++ b/frontend/src/componets/form/formComplete/index.tsx @@ -0,0 +1,402 @@ +import { Grid, IconButton, Paper, Tooltip, Typography } from '@mui/material'; +import React, { useCallback, useEffect, useState } from 'react'; +import { FieldValues, Path, useFieldArray, useForm } from 'react-hook-form'; +import { useHistory, useParams } from 'react-router-dom'; +// +import AlertDialog from '../../dialog/alertDialog'; +import { FormButton } from '../formButton'; +import { useContextGlobal } from '../../../context/ContextGlobal'; +import { useToast } from '../../../context/ToastContext'; +import api from '../../../services/api'; +import { + handleExceptionMessage, + handleExceptionMultipleMessages, +} from '../../../util/handleExceptionAxios'; +import { message } from '../../../util/handleMessages'; +import { FormInputProps } from '../formInterfaces'; +import RenderForm from '../renderForm'; +import { + IFormProps, + ImperativeHandleAccessedByParentComponent, +} from '../../interfaces/formProps'; +import { IconComponent, icons } from '../../icons'; + +import './styles.scss'; +import { useWindowSize } from '../../../util/responsiveness'; +import { SubFormComplete } from '../subFormComplete'; +import { formatNumber } from '../../../util/infoFormat'; + +const AdditionalDataFooter: React.FC<{ data: any }> = props => { + const { data } = props; + + if (data != null) { + return ( + + {`Total: ${formatNumber(data)}`} + + ); + } + return <>; +}; + +const FormComplete = React.forwardRef( + ( + props: IFormProps, + ref?: React.Ref>, + ) => { + const { + settings, + defaultValues, + inputsForm, + implSetValueData, + callbackSuccess, + configDataFooter, + } = props; + const history = useHistory(); + const params = useParams<'id' | any>(); + const { addToast } = useToast(); + const { setOpenLoading } = useContextGlobal(); + const [openModalDelete, setOpenModalDelete] = useState(false); + const [width] = useWindowSize(); + const [indexes, setIndexes] = useState>({}); + const [open, setOpen] = useState>({}); + const [data, setData] = useState(null); + const [resultDataFooter, setResultDataFooter] = useState(null); + + const { handleSubmit, control, reset, setValue, getValues, watch } = + useForm({ + defaultValues, + }); + + const dynamicFieldArrays = inputsForm.reduce((acc, i) => { + if (i.typeInput === 'subForm') { + // eslint-disable-next-line react-hooks/rules-of-hooks + acc[i.name] = useFieldArray({ + control, + name: i.name as any, + }); + } + return acc; + }, {} as Record>); + + const handleClick = useCallback((index: any, nameFields: string) => { + setIndexes((prev: any) => ({ ...prev, [nameFields]: index })); + setOpen((prev: any) => ({ ...prev, [nameFields]: true })); + }, []); + + const handleDeleteItemTable = useCallback( + (index: number, nameFields: string) => { + const fieldArrays = dynamicFieldArrays[nameFields]; + fieldArrays.remove(index); + }, + [dynamicFieldArrays], + ); + + const setValueData = useCallback( + (data: T) => { + for (const input of inputsForm) { + if (input?.setData) { + setValue(input.name as Path, input.setData(data)); + continue; + } + + setValue(input.name as Path, data[input.name]); + } + }, + [inputsForm, setValue], + ); + + const setValueInput = useCallback( + ({ value, field }: { value: any; field: string }) => { + setValue(field as Path, value); + }, + [setValue], + ); + + // vai ter que passar no model + const setModel = useCallback( + (data: any) => { + if (implSetValueData) { + implSetValueData(data); + return null; + } + setValueData(data); + return null; + }, + [implSetValueData, setValueData], + ); + + const handleNewItemTable = useCallback((nameFields: string) => { + setIndexes((prev: any) => ({ ...prev, [nameFields]: -1 })); + setOpen((prev: any) => ({ ...prev, [nameFields]: true })); + }, []); + + React.useImperativeHandle( + ref, + () => ({ + setValue, + handleClick, + handleDeleteItemTable, + handleNewItemTable, + dynamicFieldArrays, + setValueInput, + watch, + }), + [ + setValue, + handleClick, + handleDeleteItemTable, + handleNewItemTable, + dynamicFieldArrays, + setValueInput, + watch, + ], + ); + + useEffect(() => { + if (params && params.id) { + setOpenLoading(true); + api.get(`${settings.apiPath}/${params.id}`) + .then(response => { + setData(response.data); + setModel(response.data); + setOpenLoading(false); + }) + .catch(e => { + console.error(e); + setOpenLoading(false); + + const messageResponse = handleExceptionMessage(e); + setOpenLoading(false); + addToast({ + type: 'error', + title: message.error.selectOne, + description: messageResponse, + }); + }); + } + }, [params]); + + useEffect(() => { + if (configDataFooter?.dataFooter) { + setResultDataFooter( + configDataFooter.dataFooter({ + data: dynamicFieldArrays[configDataFooter.nameFields] + .fields, + }), + ); + } + }, [configDataFooter, dynamicFieldArrays]); + + const inputs = React.useMemo[]>( + () => [ + ...inputsForm.map(i => { + if (i.typeInput === 'subForm') { + i.index = + indexes[i.name] == null ? -1 : indexes[i.name]; + const setIndex = (index: number) => { + setIndexes((prev: any) => ({ + ...prev, + [i.name]: index, + })); + }; + i.setIndex = setIndex; + i.getValues = getValues; + i.setValue = setValue; + + i.useDynamicFieldArray = dynamicFieldArrays[i.name]; + + const openModal = open[i.name]; + const setOpenModal = (open: boolean) => { + setOpen((prev: any) => ({ + ...prev, + [i.name]: open, + })); + }; + i.openModal = openModal; + i.setOpenModal = setOpenModal; + } + return { ...i, control, setValue }; + }), + ], + [ + inputsForm, + control, + setValue, + indexes, + getValues, + dynamicFieldArrays, + open, + ], + ); + + const submit = async (dataToSubmit: any, e: any) => { + e.preventDefault(); + + if (dataToSubmit['undefined']) { + delete dataToSubmit['undefined']; + } + try { + setOpenLoading(true); + + for (const input of inputsForm) { + if (!input?.dto) { + continue; + } + dataToSubmit = input.dto(dataToSubmit); + } + + if (params && params.id) { + await api.put( + `${settings.apiPath}/${params.id}`, + dataToSubmit, + ); + } else { + await api.post(`${settings.apiPath}`, dataToSubmit); + } + addToast({ + type: 'success', + title: message.success.save, + description: '', + }); + setOpenLoading(false); + reset(defaultValues); + + if (!callbackSuccess) { + history.push(`${settings.pathList}?`); + } + + if (callbackSuccess) { + callbackSuccess(data); + } + } catch (error) { + setOpenLoading(false); + const messagesResponse = handleExceptionMultipleMessages(error); + let insideErrors = false; + for (const messageResponse of messagesResponse) { + addToast({ + type: 'error', + title: message.error.save, + description: messageResponse, + }); + insideErrors = true; + } + if (!insideErrors) { + addToast({ + type: 'error', + title: message.error.save, + description: 'Algo deu errado', + }); + } + } + }; + + const handleCancel = () => { + history.goBack(); + }; + + const handleDelete = async (id: string) => { + setOpenLoading(true); + + try { + await api.delete(`${settings.apiPath}/${id}`); + addToast({ + type: 'success', + title: message.success.delete, + description: '', + }); + setOpenLoading(false); + history.push(`${settings.pathList}?`); + } catch (error: any) { + const messageResponse = handleExceptionMessage(error); + setOpenLoading(false); + addToast({ + type: 'error', + title: message.error.delete, + description: messageResponse, + }); + } + }; + + const handleConfirmeDelete = async (confirm: boolean) => { + if (confirm) { + setOpenModalDelete(false); + handleDelete(params.id); + } else { + setOpenModalDelete(false); + } + }; + + return ( +
    + + +
    +
    + {params.id && ( + + { + setOpenModalDelete(true); + }}> + + + + )} +
    +
    +
    + + + +
    +
    +
    + + handleCancel()} + /> +
    + {} +
    +
    + {inputs + .filter( + i => i.typeInput === 'subForm' && i.setOpenModal, + ) + .map(data => { + const { append, update } = + data.useDynamicFieldArray; + return ( + + ); + })} +
    +
    + ); + }, +); + +export default FormComplete; diff --git a/frontend/src/componets/form/formComplete/styles.scss b/frontend/src/componets/form/formComplete/styles.scss new file mode 100644 index 0000000..7b78b09 --- /dev/null +++ b/frontend/src/componets/form/formComplete/styles.scss @@ -0,0 +1,47 @@ +.principal-container { + display: flex; + flex-direction: column; + width: 100%; + margin: 0 !important; + max-width: none !important; + + &-header { + display: flex; + flex-direction: row-reverse; + + } + + .info-footer { + display: flex; + justify-content: space-between; + align-items: center; + margin-right: 16px; + + @media (max-width: 600px) { + align-items: normal; + flex-direction: column-reverse; + + #total { + margin-bottom: 16px; + } + } + + .footer-buttons { + display: flex; + flex-direction: row; + + button { + margin-right: 8px; + } + + button:last-of-type { + margin-right: 0; + } + } + + } +} + +.container-box { + margin: 0 288px 0 0 !important; +} diff --git a/frontend/src/componets/form/formInputDate.tsx b/frontend/src/componets/form/formInputDate.tsx new file mode 100644 index 0000000..d656bba --- /dev/null +++ b/frontend/src/componets/form/formInputDate.tsx @@ -0,0 +1,140 @@ +import { TextField } from '@mui/material'; +import { DesktopDatePicker } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; +import { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker'; +import { ptBR } from 'date-fns/locale'; +import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import * as React from 'react'; +import { Controller } from 'react-hook-form'; +import { momentZoneToDate } from '../../util/dateUtil'; +import { handleMessageError } from '../../util/handleMessages'; + +export interface IFormInputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; + setValue: any; + fullWidth: boolean; + inputFormat?: string; + formattedInput?: string; + placeholder?: string; + messagesError?: { type: string; message: string }[]; +} + +export const FormInputDate = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnKeyPress, + setValue, + fullWidth, + inputFormat, + formattedInput, + placeholder, + messagesError, +}: IFormInputProps) => { + if (!variant) { + variant = 'outlined'; + } + + if (!placeholder) { + placeholder = 'dd/mm/aaaa'; + } + + return ( + { + return ( + + {inputFormat && inputFormat === 'dd/MM/yyyy' ? ( + { + if (data) { + setValue(name, new Date(data)); + } else { + setValue(name, null); + } + if (formattedInput) { + setValue( + formattedInput, + String(originalInput), + ); + } + }} + renderInput={params => ( + + )} + /> + ) : ( + { + if (data) { + setValue(name, momentZoneToDate(data)); + } else { + setValue(name, null); + } + }} + renderInput={params => ( + + )} + /> + )} + + ); + }} + /> + ); +}; diff --git a/frontend/src/componets/form/formInputDateWithoutHour.tsx b/frontend/src/componets/form/formInputDateWithoutHour.tsx new file mode 100644 index 0000000..b3be3b2 --- /dev/null +++ b/frontend/src/componets/form/formInputDateWithoutHour.tsx @@ -0,0 +1,151 @@ +import { TextField } from '@mui/material'; +import { DatePicker, DesktopDatePicker } from '@mui/x-date-pickers'; +import 'dayjs/locale/pt-br'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; +import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import { ptBR } from 'date-fns/locale'; +import { Controller } from 'react-hook-form'; +import { momentZoneToDate } from '../../util/dateUtil'; +import { parse, isValid, format } from 'date-fns'; +// import { ptBR } from '@mui/x-date-pickers/locales'; +// import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; + +export interface IFormInputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; + setValue: any; + fullWidth: boolean; + setError?: (field: any, customError: any) => void; + clearErrors?: (field: any) => void; + placeholder?: string; +} + +function isValidDate(dateString: string) { + const regex = /^(\d{2})\/(\d{2})\/(\d{4})$/; + if (!regex.test(dateString)) { + return false; + } + const date = parse(dateString, 'dd/MM/yyyy', new Date()); + return isValid(date); +} + +function handleMessageError({ + errors, + fieldError, + name, + messageError, +}: { + errors: any; + fieldError: any; + name: any; + messageError?: (errors: any, fieldError?: any) => string; +}) { + if (errors && messageError && fieldError) { + return messageError(fieldError, name); + } + if (errors && fieldError?.message) { + return fieldError?.message; + } + return ''; +} + +export const FormInputDateWithoutHour = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnKeyPress, + setValue, + fullWidth, + setError, + clearErrors, + placeholder, +}: IFormInputProps) => { + if (!variant) { + variant = 'outlined'; + } + if (!placeholder) { + placeholder = 'dd/mm/aaaa'; + } + return ( + { + return ( + + { + if ( + isValidDate(String(orignalInput)) && + error && + clearErrors + ) { + clearErrors(name); + } else if ( + orignalInput && + !error && + setError && + !isValidDate(String(orignalInput)) + ) { + setError(name, { + type: `custom_date`, + message: + 'A data está com um formato inválido', + }); + } + let newDate = null; + if (data) { + newDate = momentZoneToDate(data); + } + setValue(name, newDate); + handleChange && handleChange(data); + }} + renderInput={params => { + return ( + + ); + }} + /> + + ); + }} + /> + ); +}; diff --git a/frontend/src/componets/form/formInputNumber.tsx b/frontend/src/componets/form/formInputNumber.tsx new file mode 100644 index 0000000..b652551 --- /dev/null +++ b/frontend/src/componets/form/formInputNumber.tsx @@ -0,0 +1,104 @@ +import { Tooltip } from '@mui/material'; +import TextField from '@mui/material/TextField'; +import { Controller } from 'react-hook-form'; +import NumberFormat from 'react-number-format'; +import { handleMessageError } from '../../util/handleMessages'; + +export interface IFormInputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; + decimalScale: number; + handleOnBlur?: any; + autoFocus?: boolean; + readOnly?: boolean; + messagesError?: { type: string; message: string }[]; +} + +export const FormInputNumber = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnKeyPress, + decimalScale, + handleOnBlur, + autoFocus, + readOnly, + messagesError, +}: IFormInputProps) => { + if (!variant) { + variant = 'outlined'; + } + return ( + { + return ( + + input && autoFocus && input.focus() + } + helperText={handleMessageError( + messageError, + messagesError, + error, + name, + )} + InputProps={{ + readOnly: readOnly, + }} + error={!!error} + variant={variant} + label={label} + size="small" + fullWidth + onKeyPress={(data: any) => { + handleOnKeyPress && handleOnKeyPress(data); + }} + onKeyUp={(event: any) => { + if ( + event.target?.value === '0,00' && + event.code === 'Backspace' + ) { + event.target.value = ''; + } + }} + onValueChange={values => { + onChange(Number(values.value)); + // const value = values.floatValue; + + handleChange && handleChange(Number(values.value)); + }} + autoComplete="off" + onBlur={(event: any) => { + handleOnBlur && handleOnBlur(event); + }} + decimalScale={decimalScale} + value={value} + decimalSeparator="," + displayType="input" + thousandSeparator="." + allowNegative={true} + fixedDecimalScale={true} + /> + ); + }} + /> + ); +}; diff --git a/frontend/src/componets/form/formInputNumericTest2.tsx b/frontend/src/componets/form/formInputNumericTest2.tsx new file mode 100644 index 0000000..e232d20 --- /dev/null +++ b/frontend/src/componets/form/formInputNumericTest2.tsx @@ -0,0 +1,74 @@ +import NumericInput from 'material-ui-numeric-input'; +import { Controller } from 'react-hook-form'; + +export interface IFormInputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnBlur?: any; + handleOnKeyPress?: (data: any) => void; + precision: boolean; +} + +export const FormInputNumericTest = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnBlur, + handleOnKeyPress, + precision, +}: IFormInputProps) => { + if (!variant) { + variant = 'outlined'; + } + return ( + { + return ( + { + onChange(event); + handleChange && handleChange(event); + }} + onBlur={event => { + // onChange(event); + handleOnBlur && handleOnBlur(event); + }} + onKeyPress={(data: any) => { + handleChange && handleChange(data); + }} + value={value ?? ''} + fullWidth + label={label} + variant={variant} + autoComplete="off" + /> + ); + }} + /> + ); +}; diff --git a/frontend/src/componets/form/formInputText.tsx b/frontend/src/componets/form/formInputText.tsx new file mode 100644 index 0000000..9aad4e5 --- /dev/null +++ b/frontend/src/componets/form/formInputText.tsx @@ -0,0 +1,258 @@ +import { + IconButton, + InputAdornment, + InputProps, + TextField, + Tooltip, +} from '@mui/material'; +import AccountCircle from '@mui/icons-material/AccountCircle'; + +import { Controller } from 'react-hook-form'; +import { randomId } from '../../util/randomIdInput'; +import { cepMask } from './mask/cep'; +import { cpfAndCnpjMask } from './mask/cpfAndCnpj'; +import { numberMask } from './mask/number'; +import { phoneMask } from './mask/phone'; +import { toUpperCaseMask } from './mask/toUpperCase'; +import { handleMessageError } from '../../util/handleMessages'; +import { IButtonProps, IconComponent } from '../icons'; + +export interface IFormInputProps extends InputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label?: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any, name?: string) => void; + handleOnBlur?: (data: any) => void; + ref?: any; + autoFocus?: boolean; + readOnly?: boolean; + size?: 'small' | 'medium' | undefined; + sx?: any; + type?: any; + multiline?: boolean; + mask?: + | 'phone' + | 'number' + | 'identification' + | 'cep' + | 'toUpperCase' + | undefined; + hidden?: boolean; + inactiveRandomId?: boolean; + messagesError?: { type: string; message: string }[]; + actionOnInput?: { + action: () => void; + iconProps: IButtonProps; + textTooltip: string; + }; + activeDebounce?: boolean; + setValue?: (key: string, value: any) => void; + setError?: (field: any, customError: any) => void; + clearErrors?: (field: any) => void; + id?: string; + placeholder?: string; + endAdornment?: React.ReactNode; +} + +export const execMask = (mask: string, value: string, onBlur: boolean) => { + switch (mask) { + case 'phone': + return phoneMask(value, onBlur); + case 'number': + return numberMask(value); + case 'identification': + return cpfAndCnpjMask(value, onBlur); + case 'cep': + return cepMask(value, onBlur); + case 'toUpperCase': + return toUpperCaseMask(value, onBlur); + + default: + return ''; + } +}; + +export const FormInputText = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnKeyPress, + autoFocus, + readOnly, + size, + sx, + type, + multiline, + mask, + handleOnBlur, + inactiveRandomId, + messagesError, + actionOnInput, + setValue, + id: idInput, + placeholder, + endAdornment, +}: IFormInputProps) => { + if (!variant) { + variant = 'outlined'; + } + + if (!label) { + label = ''; + } + + let id = name; + if (!inactiveRandomId) { + id = randomId(name); + } + if (idInput) { + id = idInput; + } + + return ( +
    + { + if (multiline) { + return ( + { + input && autoFocus && input.focus(); + }} + helperText={ + messageError && messageError(error, name) + } + error={!!error} + size={size || 'small'} + onChange={event => { + onChange(event); + handleChange && handleChange(event); + }} + onKeyPress={(data: any) => { + handleOnKeyPress && + handleOnKeyPress(data, name); + }} + onBlur={(data: any) => { + handleOnBlur && handleOnBlur(data); + }} + value={value || ''} + fullWidth + label={label} + variant={variant} + /> + ); + } + return ( + { + input && autoFocus && input.focus(); + }} + helperText={handleMessageError( + messageError, + messagesError, + error, + name, + )} + error={!!error} + size={size || 'small'} + onChange={event => { + if (mask && event.target.value) { + event.target.value = execMask( + mask, + event.target.value, + false, + ); + } + onChange(event); + if (event.target.value != value && setValue) { + setValue(name, event.target.value); + } + handleChange && handleChange(event); + }} + onKeyPress={(data: any) => { + handleOnKeyPress && + handleOnKeyPress(data, name); + }} + onBlur={(event: any) => { + if (mask && event.target.value) { + event.target.value = execMask( + mask, + event.target.value, + true, + ); + onChange(event); + } + handleOnBlur && handleOnBlur(event); + }} + value={value || ''} + fullWidth + label={label} + variant={variant} + placeholder={placeholder ?? ''} + // slotProps={{ + // input: { + // startAdornment: ( + // + // + // + // ), + // }, + // }} + /> + ); + }} + /> + {actionOnInput && ( + actionOnInput.action()}> + actionOnInput.action()}> + + + + )} +
    + ); +}; diff --git a/frontend/src/componets/form/formInputTextTest.tsx b/frontend/src/componets/form/formInputTextTest.tsx new file mode 100644 index 0000000..eb3baea --- /dev/null +++ b/frontend/src/componets/form/formInputTextTest.tsx @@ -0,0 +1,158 @@ +import { InputProps, OutlinedInput, TextField } from '@mui/material'; +import React, { ComponentProps } from 'react'; +import { Controller } from 'react-hook-form'; + +export interface IFormInputProps extends InputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; + ref?: any; + autoFocus?: boolean; + readOnly?: boolean; + mask?: string; +} + +// export interface IFormInputProps { +// variant?: 'outlined' | 'standard' | 'filled' | undefined; +// name: string; +// control: any; +// rules?: any; +// label: string; +// messageError?: (errors: any, field: any) => string; +// handleChange?: any; +// handleOnKeyPress?: (data: any) => void; +// ref?: any; +// autoFocus?: boolean; +// readOnly?: boolean; +// } + +function phone(value: string, onBlur: boolean) { + if (onBlur) { + if (!(value.length >= 9)) { + return ''; + } + } + // Remove tudo o que não é dígito + value = value.replace(/\D/g, ''); + + if (value.length > 9) { + value = value.substring(0, 9); + } + + return value.replace(/(\d)(\d{4})$/, '$1-$2'); +} + +const execMask = (mask: string, value: string, onBlur: boolean) => { + switch (mask) { + case 'phone': + return phone(value, onBlur); + + default: + return ''; + } +}; + +export const FormInputTextTest = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnKeyPress, + autoFocus, + readOnly, + mask, +}: IFormInputProps) => { + if (!variant) { + variant = 'outlined'; + } + + return ( + { + return ( + input && autoFocus && input.focus()} + helperText={messageError && messageError(error, name)} + error={!!error} + size={'small'} + onChange={event => { + if (mask && event.target.value) { + event.target.value = execMask( + mask, + event.target.value, + false, + ); + } + onChange(event); + handleChange && handleChange(event); + }} + onKeyPress={(data: any) => { + handleOnKeyPress && handleOnKeyPress(data); + }} + onBlur={(event: any) => { + if (mask && event.target.value) { + event.target.value = execMask( + mask, + event.target.value, + true, + ); + onChange(event); + } + }} + value={value || ''} + fullWidth + label={label} + variant={variant} + // InputProps={{ + // inputComponent: ({ inputRef, ...props }) => ( + // + // + // onChange({ + // target: { name: name, value }, + // }) + // } + // overwrite + // /> + // ), + // }} + /> + ); + }} + /> + ); +}; diff --git a/frontend/src/componets/form/formInterfaces.tsx b/frontend/src/componets/form/formInterfaces.tsx new file mode 100644 index 0000000..237cf03 --- /dev/null +++ b/frontend/src/componets/form/formInterfaces.tsx @@ -0,0 +1,118 @@ +import { InputProps } from '@mui/material'; +import { ReactTableProps } from '../table'; +import { IButtonProps } from '../icons'; + +// interface FormInputText +export interface IFormInputProps extends InputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; + handleOnBlur?: (data: any) => void; + ref?: any; + autoFocus?: boolean; + readOnly?: boolean; + size?: 'small' | 'medium' | undefined; + sx?: any; + type?: any; + multiline?: boolean; + mask?: + | 'phone' + | 'number' + | 'identification' + | 'cep' + | 'toUpperCase' + | undefined; + hidden?: boolean; +} + +export interface InputPropsToForm extends IFormInputProps { + typeInput: + | 'text' + | 'date' + | 'autocomplete' + | 'number' + | 'subForm' + | 'component' + | 'password' + | 'checkbox'; + loadingAutocomplete?: boolean; + options?: any[]; + setValue?: any; + md?: number; + xs?: number; + getValues?: (name: string) => any | any[] | undefined; + setError?: any; + clearErrors?: any; + handleChange?: any; + rules?: any; + decimalScale?: 0 | 2; + show?: boolean | true; + setFocusFirstField?: (value: boolean) => void; + placeholder?: string; + messagesError?: any[]; + dto?: (data: any) => any; +} + +export interface FormInputProps extends IFormInputProps { + typeInput: + | 'text' + | 'date' + | 'dateHour' + | 'autocomplete' + | 'number' + | 'subForm' + | 'component' + | 'password' + | 'checkbox'; + loadingAutocomplete?: boolean; + options?: any[]; + setValue?: any; + md?: number; + xs?: number; + getValues?: (name: string) => any | any[] | undefined; + setError?: any; + clearErrors?: any; + handleChange?: any; + rules?: any; + decimalScale?: 0 | 2; + show?: boolean | true; + setFocusFirstField?: (value: boolean) => void; + placeholder?: string; + messagesError?: any[]; + dto?: (data: any) => any; + setData?: (data: any) => any; + dataTable?: { + propsTable: ReactTableProps; + handleNewItemTable?: () => void; + inputs: FormInputProps[]; + keyArrData?: string; + }; + actionOnInput?: { + action: () => void; + iconProps: IButtonProps; + textTooltip: string; + }; + componentProps?: { + component?: React.ReactNode; + componentData?: (data: any) => React.ReactNode; + conditionRender: boolean; + }; + toolTipPros?: { + title: string; + arrow: boolean; + }; + inputFormat?: string; + multiple?: boolean; + activeDebounce?: boolean; + query?: (value: string) => string; + index?: number; + setIndex?: (index: number) => void; + useDynamicFieldArray?: any; + openModal?: boolean; + setOpenModal?: (open: boolean) => void; +} diff --git a/frontend/src/componets/form/formSelect.tsx b/frontend/src/componets/form/formSelect.tsx new file mode 100644 index 0000000..9081c93 --- /dev/null +++ b/frontend/src/componets/form/formSelect.tsx @@ -0,0 +1,53 @@ +import { MenuItem, Select } from '@mui/material'; +import React from 'react'; +import { Controller } from 'react-hook-form'; + +export interface IFormInputProps { + variant?: 'outlined' | 'standard' | 'filled' | undefined; + name: string; + control: any; + rules?: any; + label: string; + messageError?: (errors: any, field: any) => string; + handleChange?: any; + handleOnKeyPress?: (data: any) => void; +} + +export const FormSelect = ({ + variant, + name, + control, + rules, + label, + messageError, + handleChange, + handleOnKeyPress, +}: IFormInputProps) => { + if (!variant) { + variant = 'outlined'; + } + return ( + { + return ( + + ); + }} + /> + ); +}; diff --git a/frontend/src/componets/form/mask/cep.ts b/frontend/src/componets/form/mask/cep.ts new file mode 100644 index 0000000..01d7929 --- /dev/null +++ b/frontend/src/componets/form/mask/cep.ts @@ -0,0 +1,15 @@ +export function cepMask(value: string, onBlur: boolean) { + if (onBlur) { + if (!(value.length >= 9)) { + return ''; + } + } + // Remove tudo o que não é dígito + value = value.replace(/\D/g, ''); + + if (value.length > 8) { + value = value.substring(0, 8); + } + + return value.replace(/(\d)(\d{3})$/, '$1-$2'); +} diff --git a/frontend/src/componets/form/mask/cpfAndCnpj.ts b/frontend/src/componets/form/mask/cpfAndCnpj.ts new file mode 100644 index 0000000..43bc30f --- /dev/null +++ b/frontend/src/componets/form/mask/cpfAndCnpj.ts @@ -0,0 +1,55 @@ +export function cpfAndCnpjMask(value: string, onBlur: boolean) { + if (onBlur) { + // if (!(value.length == 14) && !(value.length == 18)) { + // return ''; + // } + } + // Remove tudo o que não é dígito + value = value.replace(/\D/g, ''); + + // CNPJ - Ex.: 46.852.487/0001-31 - (18) (4) + if (value.length > 11) { + if (value.length == 12) { + return value.replace( + new RegExp(eval(`/(\\d{2})(\\d{3})(\\d{3})(\\d{4})$/`)), + '$1.$2.$3/$4', + ); + } + if (value.length > 12) { + if (value.length > 14) { + value = value.substring(0, 14); + } + const length = value.length - 12; + return value.replace( + new RegExp( + eval(`/(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{${length}})$/`), + ), + '$1.$2.$3/$4-$5', + ); + } + } + + if (value.length <= 6 && value.length > 3) { + const length = value.length - 3; + // return value.replace(new RegExp(eval(`/${str}/i`)), '$1.$2'); + return value.replace( + new RegExp(eval(`/(\\d{3})(\\d{${length}})$/`)), + '$1.$2', + ); + } + + if (value.length <= 9) { + const length = value.length - 3 - 3; + // return value.replace(new RegExp(eval(`/${str}/i`)), '$1.$2'); + return value.replace( + new RegExp(eval(`/(\\d{3})(\\d{3})(\\d{${length}})$/`)), + '$1.$2.$3', + ); + } + const length = value.length - 3 - 3 - 3; + + return value.replace( + new RegExp(eval(`/(\\d{3})(\\d{3})(\\d{3})(\\d{${length}})$/`)), + '$1.$2.$3-$4', + ); +} diff --git a/frontend/src/componets/form/mask/exampleGenericMask.ts b/frontend/src/componets/form/mask/exampleGenericMask.ts new file mode 100644 index 0000000..ee745a7 --- /dev/null +++ b/frontend/src/componets/form/mask/exampleGenericMask.ts @@ -0,0 +1,607 @@ +import { forEach, values } from 'lodash'; +import { ChangeEvent } from 'react'; + +interface IExample { + quantity: number; + type: 'number' | 'letter'; + finalKey?: string; +} +const configsRegex = { + number: (quantity: number) => (quantity ? `(\\d{${quantity}})` : `(\\d)`), + letter: (quantity: number) => `([a-zA-Z]{${quantity}})`, + underline: (quantity: number) => + quantity ? `([\\s\\S]{${quantity}})` : `(_)`, +}; + +const example: IExample[] = [ + // { quantity: 2, type: 'letter', finalKey: '-' }, + // { quantity: 4, type: 'number', finalKey: '.' }, + // { quantity: 1, type: 'number' }, + { quantity: 0, type: 'number', finalKey: '-' }, + { quantity: 4, type: 'number' }, +]; +const addQuantityCharacters = 5; + +let regexExample = ''; +let regexReplace = ''; +let regexToApplyUnderline = ''; +let quantityCharacters = 0; +let listFinalKeys: string[] = []; +example.forEach((e, index) => { + regexExample += `${configsRegex[e.type](e.quantity)}`; + regexToApplyUnderline += `${configsRegex['underline'](e.quantity)}`; + quantityCharacters += e.quantity; + if (e.finalKey) { + regexReplace += `$${index + 1}${e.finalKey}`; + listFinalKeys.push(e.finalKey); + } +}); +regexExample += '$'; +regexReplace += `$${example.length}`; +quantityCharacters += addQuantityCharacters; +let regexToRemove: any = '[^0-9]+'; +if (example.some(e => e.type === 'letter')) { + regexToRemove = '[^0-9a-zA-Z]+'; +} +regexToRemove = new RegExp(regexToRemove, 'i'); + +const optional = '[_\\d]{1}'; +const upperCaseLetter = '[A-Z]{1}'; +const lowerCaseLetter = '[a-z]{1}'; +const number = '[\\d{1}]'; + +function chooseRegexByType({ + type, + character, +}: { + type: + | 'optional' + | 'upperCaseLetter' + | 'lowerCaseLetter' + | 'number' + | 'character'; + character: string | null; +}) { + if (type === 'optional') { + return optional; + } + if (type === 'upperCaseLetter') { + return upperCaseLetter; + } + if (type === 'lowerCaseLetter') { + return lowerCaseLetter; + } + if (type === 'number') { + return number; + } + return `[${character}]{1}`; +} + +interface IConfig { + type: + | 'optional' + | 'upperCaseLetter' + | 'lowerCaseLetter' + | 'number' + | 'character'; + character: string | null; +} + +export const configMaskPhone: IConfig[] = [ + { type: 'optional', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'character', character: '-' }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, +]; + +export function applyInitialValue(newConfig: IConfig[]): string { + let mask = ''; + const arrToIgnore = ['optional', '']; + const arrNotIgnore = ['number', 'upperCaseLetter', 'lowerCaseLetter']; + newConfig.forEach(c => { + if (c.type === 'character') { + mask += c.character; + } + if (arrNotIgnore.includes(c.type)) { + mask += '_'; + } + }); + return mask; +} + +function setCharAt(str: any, index: any, chr: any) { + if (index > str.length - 1) return str; + return str.substring(0, index) + chr + str.substring(index + 1); +} + +function maskValue({ + value, + configMask, + selectionStart, +}: { + value: any; + configMask: IConfig[]; + selectionStart: number; +}) { + if (!value) { + return { + value: applyInitialValue(configMask), + length: 0, + }; + } + + let valueSplitted = value.split(''); + let configMaskOptionals = configMask.filter(c => c.type !== 'optional'); + + if (!value.includes('_')) { + for (const idx in configMaskOptionals) { + if (configMaskOptionals[idx].character) { + valueSplitted.push(configMaskOptionals[idx].character); + continue; + } + if (!valueSplitted[idx]) { + valueSplitted.push('_'); + } + } + valueSplitted.splice(selectionStart + 1, 0, '_'); + } + + const config = configMaskOptionals[selectionStart]; + if (value.length > configMaskOptionals.length && !value.includes('_')) { + return { value: value.slice(0, -1), length: 0 }; + } + + let idxToRemove = -1; + + for (const idx in valueSplitted) { + if (Number(idx) >= selectionStart && valueSplitted[idx] == '_') { + idxToRemove = Number(idx); + } + + if (idxToRemove != -1) { + break; + } + } + + if (idxToRemove >= 0) { + valueSplitted.splice(idxToRemove, 1); + } + + value = valueSplitted.join(''); + + let isValid = true; + valueSplitted.forEach((v: any, idx: number) => { + const validRegex = new RegExp( + chooseRegexByType({ + type: configMaskOptionals[idx].type, + character: configMaskOptionals[idx].character, + }), + 'i', + ); + + if (!validRegex.test(v) && v !== '_') { + valueSplitted[idx] = '_'; + isValid = false; + } + }); + + if (isValid) { + isValid = !value.includes('_'); + } + + if (!isValid) { + value = value.replaceAll('-', ''); + + valueSplitted = value.split(''); + + valueSplitted.splice(4, 0, '-'); + + const addLength = config.character ? 1 : 0; + + const newValue = valueSplitted.join(''); + return { value: newValue, length: addLength > 0 ? 4 + addLength : 0 }; + } + + return { value: value, length: 0 }; +} + +interface IKeyPress { + keyPress?: string; +} +function maskValue2({ + value, + configMask, + event, +}: { + value: any; + configMask: IConfig[]; + event?: ChangeEvent; +}) { + if (!value) { + return { + value: applyInitialValue(configMask), + length: 0, + }; + } + + const selectionStart = event?.target?.selectionStart || 0; + + const keyMask = '_'; + let configMaskOptionals = configMask.filter(c => c.type !== 'optional'); + let addSelectionStart = 0; + + let valueSplitted = value.split(''); + let newValueSplitted: any[] = []; + newValueSplitted.push(...valueSplitted); + + if (event?.target?.keyPress === 'Backspace') { + if (configMaskOptionals[selectionStart]?.type === 'character') { + // addSelectionStart = 1; + newValueSplitted.splice( + selectionStart, + 0, + configMaskOptionals[selectionStart].character, + ); + } else { + newValueSplitted.splice(selectionStart, 0, keyMask); + } + + return { + value: newValueSplitted.join(''), + length: selectionStart + addSelectionStart, + }; + } + + newValueSplitted = [...configMaskOptionals]; + + const oldSelectionStart = selectionStart - 1; + if ( + configMaskOptionals[selectionStart - 1]?.type === 'character' && + oldSelectionStart === selectionStart - 1 && + valueSplitted[selectionStart] === + configMaskOptionals[selectionStart - 1].character + ) { + const keepCharacter = valueSplitted[oldSelectionStart]; + valueSplitted[selectionStart] = valueSplitted[oldSelectionStart]; + valueSplitted[oldSelectionStart] = keepCharacter; + addSelectionStart = 1; + } + + const oldValueSplitted = + event?.currentTarget?.defaultValue?.split('') || []; + if (oldValueSplitted[selectionStart - 1] === keyMask) { + valueSplitted.splice(selectionStart - 1, 1); + } + + configMaskOptionals.forEach((config, idx) => { + const { type, character } = configMaskOptionals[idx]; + + if (!valueSplitted[idx] && type !== 'character') { + newValueSplitted[idx] = keyMask; + } else if (type === 'character') { + newValueSplitted[idx] = character; + } else { + const validRegex = new RegExp( + chooseRegexByType({ + type: type, + character: character, + }), + 'i', + ); + + if (!validRegex.test(valueSplitted[idx])) { + newValueSplitted[idx] = keyMask; + } else { + newValueSplitted[idx] = valueSplitted[idx]; + } + } + }); + + if (newValueSplitted.length > configMaskOptionals.length) { + return { + value: newValueSplitted + .filter((_, idx) => idx < configMaskOptionals.length) + .join(''), + length: selectionStart, + }; + } + + if (configMaskOptionals[selectionStart]?.type === 'character') { + addSelectionStart = 1; + } + + return { + value: newValueSplitted.join(''), + length: selectionStart + addSelectionStart, + }; +} + +function maskValue3({ + value, + configMask, + event, +}: { + value: any; + configMask: IConfig[]; + event: any; +}) { + if (!value) { + return { + value: applyInitialValue(configMask), + length: 0, + }; + } + + if (event.code.includes('Arrow')) { + return { + action: 'continue', + selectionStart: event.target.selectionStart, + }; + } + + if ( + event.code !== `Key${event.key.toUpperCase()}` && + event.code !== `Digit${event.key.toUpperCase()}` && + !/Numpad(\d+)/g.test(event.code) && + event.code !== 'Backspace' + ) { + return { + action: 'InvalidKey', + selectionStart: event.target.selectionStart, + }; + } + + let selectionStart = event?.target?.selectionStart || 0; + let configMaskOptionals = configMask.filter(c => c.type !== 'optional'); + + let valueSplitted = event.target.value.split(''); + if (!valueSplitted[selectionStart]) { + valueSplitted.push(event.key); + } + + if (event.code === 'Backspace') { + valueSplitted[selectionStart] = event.key; + } + + const config = configMaskOptionals[selectionStart]; + + if (!config && event.code !== 'Backspace') { + return { + action: 'back', + selectionStart, + }; + } + + if (event.code === 'Backspace' && configMaskOptionals[selectionStart - 1]) { + let newSelectionStart = selectionStart; + if (configMaskOptionals[selectionStart - 1].character) { + newSelectionStart = selectionStart - 1; + } + return { + action: 'continue', + selectionStart: newSelectionStart, + }; + } + + let { type, character } = config; + + if (character) { + const findNext = configMaskOptionals.findIndex( + (item, index) => + index > selectionStart && item.type !== 'character', + ); + + if (findNext >= 0) { + const configCharacter = configMaskOptionals[findNext]; + type = configCharacter.type; + character = configCharacter.character; + } + selectionStart += 1; + } + + const validRegex = new RegExp( + chooseRegexByType({ + type: type, + character: character, + }), + 'i', + ); + if (!validRegex.test(event.key)) { + return { + action: 'back', + selectionStart, + }; + } + + return { + action: 'continue', + selectionStart, + }; +} + +export function phoneMask( + value: string, + onBlur: boolean, + event?: ChangeEvent, +) { + if (onBlur) { + if (!(value?.length >= quantityCharacters)) { + return ''; + } + } + // Remove tudo o que não é dígito + if (!value) { + value = ''; + } + value = value.replace(regexToRemove, ''); + + const length = value.length; + const missingChars = quantityCharacters - value.length; + if (missingChars > 0) { + const underlines = '_'.repeat(missingChars); + const formattedValue = value + underlines; + + // Aplica o formato desejado (_____-____) + value = + formattedValue.substring(0, 4) + + '-' + + formattedValue.substring(4, 10); + } + + if (value.length > quantityCharacters) { + value = value.substring(0, quantityCharacters); + } + + // regexExample = '(\\d{4})(\\d{4})$'; + const validRegex = new RegExp(regexExample, 'i'); + + value = value.replace(validRegex, regexReplace); + + return value; +} + +export function phoneMaskTest( + value: string, + onBlur: boolean, + event?: ChangeEvent, +) { + if (onBlur) { + if (!(value?.length >= quantityCharacters)) { + // return { value: '', length: 0 }; + } + } + const mask = maskValue2({ + value, + configMask: configMaskPhone, + event: event, + }); + + return { + value: mask.value, + length: + mask.length > 0 ? mask.length : event?.target?.selectionStart || 0, + }; +} + +export function phoneMaskTes3(value: string, onBlur: boolean, event: any) { + const configAllSetNewValue = ({ + configMask, + valueSplitted, + }: { + configMask: IConfig[]; + valueSplitted: string[]; + }) => { + const newValue = []; + for (const indexConfig in configMask) { + const config = configMask[indexConfig]; + + if (config?.character) { + const nextIndexCharacter = valueSplitted.findIndex( + (v: string, index: number) => + index <= Number(indexConfig) && v === config.character, + ); + + if (nextIndexCharacter >= 0) { + newValue.push(config.character); + const auxValue1 = valueSplitted[nextIndexCharacter]; + const auxValue2 = valueSplitted[indexConfig]; + valueSplitted[nextIndexCharacter] = auxValue2; + valueSplitted[indexConfig] = auxValue1; + } + } + } + return valueSplitted.join(''); + }; + + const valueSplitted = event.target?.value + ? event.target.value.split('') + : []; + valueSplitted.push(event.key); + + let configMaskOptionals = configMaskPhone.filter( + c => c.type !== 'optional', + ); + if (valueSplitted.length === configMaskOptionals.length + 1) { + configMaskOptionals = configMaskPhone; + + event.target.value = configAllSetNewValue({ + configMask: configMaskOptionals, + valueSplitted, + }); + } + const mask = maskValue3({ + value, + configMask: configMaskPhone, + event: event, + }); + + if (mask.action === 'back') { + return { + action: 'InvalidKey', + selectionStart: event.target.selectionStart, + }; + } + + return { + ...mask, + }; +} + +function applyValue({ + value, + quantityCharacters, + regexToApplyUnderline, + listFinalKeys, +}: { + value: any; + quantityCharacters: number; + regexToApplyUnderline: string; + listFinalKeys: string[]; +}) { + let newValue = ''; + if (!value) { + for (let i = 0; i < quantityCharacters; i++) { + newValue += '_'; + } + + const validRegex = new RegExp(regexToApplyUnderline, 'i'); + + return newValue.replace(validRegex, regexReplace); + } + value = value.toString(); + const lengthValue = value.length; + + newValue += value; + const listIndexes: any[] = []; + listFinalKeys.forEach(finalKey => { + const indexOf = newValue.indexOf(finalKey); + if (indexOf >= 0) { + listIndexes.push({ index: indexOf, finalKey: finalKey }); + } + }); + for (let i = 0; i < quantityCharacters - lengthValue; i++) { + newValue += '_'; + } + + if (listIndexes.length > 0 && listIndexes.length === listFinalKeys.length) { + return newValue; + } + + listFinalKeys.forEach(finalKey => { + newValue = newValue.replace(finalKey, ''); + }); + const validRegex = new RegExp(regexToApplyUnderline, 'i'); + newValue = newValue.replace(validRegex, regexReplace); + + const values = newValue.split(''); + listIndexes.forEach(item => { + values.splice(item.index + 1, 0, item.finalKey); + }); + return values.join(''); +} diff --git a/frontend/src/componets/form/mask/genericMask.ts b/frontend/src/componets/form/mask/genericMask.ts new file mode 100644 index 0000000..7add85a --- /dev/null +++ b/frontend/src/componets/form/mask/genericMask.ts @@ -0,0 +1,371 @@ +import { ChangeEvent } from 'react'; + +interface IExample { + quantity: number; + type: 'number' | 'letter'; + finalKey?: string; +} +const configsRegex = { + number: (quantity: number) => (quantity ? `(\\d{${quantity}})` : `(\\d)`), + letter: (quantity: number) => `([a-zA-Z]{${quantity}})`, + underline: (quantity: number) => + quantity ? `([\\s\\S]{${quantity}})` : `(_)`, +}; + +const example: IExample[] = [ + // { quantity: 2, type: 'letter', finalKey: '-' }, + // { quantity: 4, type: 'number', finalKey: '.' }, + // { quantity: 1, type: 'number' }, + { quantity: 0, type: 'number', finalKey: '-' }, + { quantity: 4, type: 'number' }, +]; +const addQuantityCharacters = 5; + +let regexExample = ''; +let regexReplace = ''; +let regexToApplyUnderline = ''; +let quantityCharacters = 0; +let listFinalKeys: string[] = []; +example.forEach((e, index) => { + regexExample += `${configsRegex[e.type](e.quantity)}`; + regexToApplyUnderline += `${configsRegex['underline'](e.quantity)}`; + quantityCharacters += e.quantity; + if (e.finalKey) { + regexReplace += `$${index + 1}${e.finalKey}`; + listFinalKeys.push(e.finalKey); + } +}); +regexExample += '$'; +regexReplace += `$${example.length}`; +quantityCharacters += addQuantityCharacters; +let regexToRemove: any = '[^0-9]+'; +if (example.some(e => e.type === 'letter')) { + regexToRemove = '[^0-9a-zA-Z]+'; +} +regexToRemove = new RegExp(regexToRemove, 'i'); + +const optional = '[_\\d]{1}'; +const upperCaseLetter = '[A-Z]{1}'; +const lowerCaseLetter = '[a-z]{1}'; +const number = '[\\d{1}]'; + +function chooseRegexByType({ + type, + character, +}: { + type: + | 'optional' + | 'upperCaseLetter' + | 'lowerCaseLetter' + | 'number' + | 'character'; + character: string | null; +}) { + if (type === 'optional') { + return optional; + } + if (type === 'upperCaseLetter') { + return upperCaseLetter; + } + if (type === 'lowerCaseLetter') { + return lowerCaseLetter; + } + if (type === 'number') { + return number; + } + return `[${character}]{1}`; +} + +export interface IConfig { + type: + | 'optional' + | 'upperCaseLetter' + | 'lowerCaseLetter' + | 'number' + | 'character'; + character: string | null; +} + +export const configMaskPhone: IConfig[] = [ + { type: 'optional', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'character', character: '-' }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, + { type: 'number', character: null }, +]; + +export function applyInitialValue(newConfig: IConfig[]): string { + let mask = ''; + + const arrNotIgnore = ['number', 'upperCaseLetter', 'lowerCaseLetter']; + newConfig.forEach(c => { + if (c.type === 'character') { + mask += c.character; + } + if (arrNotIgnore.includes(c.type)) { + mask += '_'; + } + }); + return mask; +} + +function maskValue3({ + value, + configMask, + event, +}: { + value: any; + configMask: IConfig[]; + event: any; +}) { + if (!value) { + return { + value: applyInitialValue(configMask), + length: 0, + }; + } + + if (event.code.includes('Arrow')) { + return { + action: 'continue', + selectionStart: event.target.selectionStart, + }; + } + + if ( + event.code !== `Key${event.key.toUpperCase()}` && + event.code !== `Digit${event.key.toUpperCase()}` && + !/Numpad(\d+)/g.test(event.code) && + event.code !== 'Backspace' + ) { + return { + action: 'InvalidKey', + selectionStart: event.target.selectionStart, + }; + } + + let selectionStart = event?.target?.selectionStart || 0; + // let configMaskOptionals = configMask.filter(c => c.type !== 'optional'); + let configMaskOptionals = configMask; + + let valueSplitted = event.target.value.split(''); + if (!valueSplitted[selectionStart]) { + valueSplitted.push(event.key); + const newValue = []; + for (const indexConfig in configMask) { + const config = configMask[indexConfig]; + + if (config?.character) { + const nextIndexCharacter = valueSplitted.findIndex( + (v: string, index: number) => + index <= Number(indexConfig) && v === config.character, + ); + + if (nextIndexCharacter >= 0) { + newValue.push(config.character); + const auxValue1 = valueSplitted[nextIndexCharacter]; + const auxValue2 = valueSplitted[indexConfig]; + valueSplitted[nextIndexCharacter] = auxValue2; + valueSplitted[indexConfig] = auxValue1; + } + } + } + } + + if (event.code === 'Backspace') { + valueSplitted[selectionStart] = event.key; + } + + const config = configMaskOptionals[selectionStart]; + + if (!config && event.code !== 'Backspace') { + return { + action: 'back', + selectionStart, + }; + } + + if (event.code === 'Backspace' && configMaskOptionals[selectionStart - 1]) { + let newSelectionStart = selectionStart; + if (configMaskOptionals[selectionStart - 1].character) { + newSelectionStart = selectionStart - 1; + } + return { + action: 'continue', + selectionStart: newSelectionStart, + }; + } + + let { type, character } = config; + + if (character) { + const findNext = configMaskOptionals.findIndex( + (item, index) => + index > selectionStart && item.type !== 'character', + ); + + if (findNext >= 0) { + const configCharacter = configMaskOptionals[findNext]; + type = configCharacter.type; + character = configCharacter.character; + } + selectionStart += 1; + } + + const validRegex = new RegExp( + chooseRegexByType({ + type: type, + character: character, + }), + 'i', + ); + if (!validRegex.test(event.key)) { + return { + action: 'back', + selectionStart, + }; + } + + return { + action: 'continue', + selectionStart, + }; +} + +export const configAllSetNewValue = ({ + configMask, + event, +}: { + configMask: IConfig[]; + event: any; +}) => { + const newValue = []; + let valueSplitted = event.target.value.split(''); + for (const indexConfig in configMask) { + const config = configMask[indexConfig]; + + if (config?.character) { + const nextIndexCharacter = valueSplitted.findIndex( + (v: string, index: number) => + index <= Number(indexConfig) && v === config.character, + ); + + if (nextIndexCharacter >= 0) { + newValue.push(config.character); + const auxValue1 = valueSplitted[nextIndexCharacter]; + const auxValue2 = valueSplitted[indexConfig]; + valueSplitted[nextIndexCharacter] = auxValue2; + valueSplitted[indexConfig] = auxValue1; + } + } + } + + return valueSplitted.join(''); +}; + +export function genericMask( + value: string, + onBlur: boolean, + event: any, + setConfigs: (configs: IConfig[]) => void, + configs: IConfig[], +) { + const valueSplitted = event.target?.value + ? event.target.value.replace(/[_]+$/, '').split('') + : []; + + if (event.code !== 'Backspace' && !event.code.includes('Arrow')) { + valueSplitted.push(event.key); + } + + if (event.code === 'Backspace') { + valueSplitted.splice(1, event.target.selectionStart); + } + + if (valueSplitted.length === configs.length + 1) { + configs = configMaskPhone; + setConfigs(configMaskPhone); + + const { selectionStart } = event.target; + event.target.value = configAllSetNewValue({ + configMask: configs, + event, + }); + event.target.selectionStart = selectionStart; + event.target.selectionEnd = selectionStart; + } + const mask = maskValue3({ + value, + configMask: configs, + event: event, + }); + + if (mask.action === 'back') { + return { + action: 'InvalidKey', + selectionStart: event.target.selectionStart, + }; + } + + return { + ...mask, + }; +} + +function applyValue({ + value, + quantityCharacters, + regexToApplyUnderline, + listFinalKeys, +}: { + value: any; + quantityCharacters: number; + regexToApplyUnderline: string; + listFinalKeys: string[]; +}) { + let newValue = ''; + if (!value) { + for (let i = 0; i < quantityCharacters; i++) { + newValue += '_'; + } + + const validRegex = new RegExp(regexToApplyUnderline, 'i'); + + return newValue.replace(validRegex, regexReplace); + } + value = value.toString(); + const lengthValue = value.length; + + newValue += value; + const listIndexes: any[] = []; + listFinalKeys.forEach(finalKey => { + const indexOf = newValue.indexOf(finalKey); + if (indexOf >= 0) { + listIndexes.push({ index: indexOf, finalKey: finalKey }); + } + }); + for (let i = 0; i < quantityCharacters - lengthValue; i++) { + newValue += '_'; + } + + if (listIndexes.length > 0 && listIndexes.length === listFinalKeys.length) { + return newValue; + } + + listFinalKeys.forEach(finalKey => { + newValue = newValue.replace(finalKey, ''); + }); + const validRegex = new RegExp(regexToApplyUnderline, 'i'); + newValue = newValue.replace(validRegex, regexReplace); + + const values = newValue.split(''); + listIndexes.forEach(item => { + values.splice(item.index + 1, 0, item.finalKey); + }); + return values.join(''); +} diff --git a/frontend/src/componets/form/mask/number.ts b/frontend/src/componets/form/mask/number.ts new file mode 100644 index 0000000..aa2fa59 --- /dev/null +++ b/frontend/src/componets/form/mask/number.ts @@ -0,0 +1,5 @@ +// Fiz essa máscara para casos ter inputs que comecem com zero, que é caso do 047 +export function numberMask(value: string) { + // Remove tudo o que não é dígito + return value.replace(/\D/g, ''); +} diff --git a/frontend/src/componets/form/mask/phone.ts b/frontend/src/componets/form/mask/phone.ts new file mode 100644 index 0000000..238b529 --- /dev/null +++ b/frontend/src/componets/form/mask/phone.ts @@ -0,0 +1,15 @@ +export function phoneMask(value: string, onBlur: boolean) { + if (onBlur) { + if (!(value.length >= 9)) { + return ''; + } + } + // Remove tudo o que não é dígito + value = value.replace(/\D/g, ''); + + if (value.length > 9) { + value = value.substring(0, 9); + } + + return value.replace(/(\d)(\d{4})$/, '$1-$2'); +} diff --git a/frontend/src/componets/form/mask/toUpperCase.ts b/frontend/src/componets/form/mask/toUpperCase.ts new file mode 100644 index 0000000..c889ead --- /dev/null +++ b/frontend/src/componets/form/mask/toUpperCase.ts @@ -0,0 +1,11 @@ +export function toUpperCaseMask(value: string, onBlur: boolean) { + if (onBlur) { + return value; + } + + if (value.length > 0) { + value = value.toLocaleUpperCase(); + } + + return value; +} diff --git a/frontend/src/componets/form/renderForm.tsx b/frontend/src/componets/form/renderForm.tsx new file mode 100644 index 0000000..a68c265 --- /dev/null +++ b/frontend/src/componets/form/renderForm.tsx @@ -0,0 +1,301 @@ +import { Grid, Tooltip, Typography } from '@mui/material'; +import { FormInputProps } from './formInterfaces'; +import { FormInputNumber } from './formInputNumber'; +import { FormAutocompleteInitialized } from './formAutocompleteInitialized'; +import { FormInputText } from './formInputText'; +import { FormInputDate } from './formInputDate'; +import { TableGeneric } from '../table'; +import { FormButton } from './formButton'; +import { FormCheckbox } from './formCheckbox'; +import { FormAutocompleteMultiple } from './formAutocompleteMultiple'; +import { Fragment } from 'react'; +import { FormInputDateWithoutHour } from './formInputDateWithoutHour'; + +interface IRenderForm { + inputsForm: FormInputProps[]; + data?: T; +} + +const RenderTypeInputComponent = ({ + field, + data, +}: { + field: any; + data: any; +}) => { + if ( + field.componentProps?.conditionRender && + field.componentProps?.componentData + ) { + return field.componentProps.componentData(data); + } + + if ( + field.componentProps?.conditionRender && + field.componentProps?.component + ) { + return field.componentProps.component; + } + return <>; +}; + +export const RenderForm = ({ + inputsForm, + data, +}: IRenderForm) => { + return ( + <> + {inputsForm.map((field, index) => { + // field.name = field.name.replace('.', ''); + let children = <>; + + if (!field?.control) return ; + if ( + field.typeInput === 'number' && + (field.decimalScale || field.decimalScale === 0) + ) { + children = ( + + + + ); + } + if (field.typeInput === 'autocomplete' && !field?.multiple) { + children = ( + + + + ); + } + if (field.typeInput === 'autocomplete' && field.multiple) { + children = ( + + + + ); + } + if (field.typeInput === 'date') { + children = ( + + + + ); + } + if (field.typeInput === 'dateHour') { + children = ( + + + + ); + } + if (field.typeInput === 'text') { + children = ( + + + + ); + } + if (field.typeInput === 'password') { + children = ( + + + + ); + } + if (field.typeInput === 'checkbox') { + children = ( + + {field.label}:{''} + + + ); + } + if ( + field.typeInput === 'subForm' && + field.dataTable?.propsTable.data && + field.control && + field?.useDynamicFieldArray + ) { + let { fields } = field.useDynamicFieldArray; + + children = ( + <> + + + { + if ( + field.dataTable + ?.handleNewItemTable + ) { + field.dataTable.handleNewItemTable(); + } else { + field?.setOpenModal && + field?.setOpenModal(true); + field?.setIndex && + field.setIndex(-1); + } + }} + /> + + + {field.label} + + + + + + + ); + } + if (field.typeInput === 'component') { + children = ( + + + + ); + } + + if (field.toolTipPros) { + children = ( + + {children} + + ); + } + return children; + })} + + ); +}; + +export default RenderForm; diff --git a/frontend/src/componets/form/subFormComplete/index.tsx b/frontend/src/componets/form/subFormComplete/index.tsx new file mode 100644 index 0000000..e02b865 --- /dev/null +++ b/frontend/src/componets/form/subFormComplete/index.tsx @@ -0,0 +1,182 @@ +import { Box, Button, Grid, Modal, Stack, Typography } from '@mui/material'; +import RenderForm from '../renderForm'; +import { FormButton } from '../formButton'; +import React from 'react'; +import { FormInputProps } from '../formInterfaces'; +import { + ArrayPath, + FieldValues, + useFieldArray, + useForm, + UseFormReturn, +} from 'react-hook-form'; +import { useToast } from '../../../context/ToastContext'; +import { ImperativeHandleAccessedByParentComponent } from '../../interfaces/formProps'; + +interface ModalProps { + open: boolean; + setOpen?: (open: boolean) => void; + index: number; + setIndex?: (index: number) => void; + getValues: any; + append: any; + update: any; + width: number; + inputs: FormInputProps[]; + nameFields: string; +} + +const style = { + position: 'absolute' as 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: '800px', + bgcolor: 'background.paper', + boxShadow: 24, + p: 2, + borderRadius: '4px', +}; + +export const SubFormComplete = (props: ModalProps) => { + const { + open, + setOpen, + index, + setIndex, + getValues, + width, + inputs: inputsForm, + nameFields, + update, + append, + } = props; + const { addToast } = useToast(); + + const useFormItems = useForm({ + defaultValues: {}, + }); + const setValueItems = useFormItems.setValue; + const controlItems = useFormItems.control; + const reset = useFormItems.reset; + const handleSubmit = useFormItems.handleSubmit; + + const inputs = React.useMemo( + () => [ + ...inputsForm.map(i => { + return { + ...i, + control: controlItems, + setValue: setValueItems, + }; + }), + ], + [inputsForm, controlItems, setValueItems], + ); + const styleModal = { + ...style, + }; + + if (width <= 800) { + styleModal.width = '90%'; + } + + React.useEffect(() => { + if (index >= 0) { + setModel(index, nameFields); + } + }, [index, open]); + + const setModel = (index: number, keyArrData = 'phones') => { + let data = {}; + for (const input of inputs) { + if (input?.setData) { + setValueItems( + input.name, + input.setData(getValues(`${keyArrData}[${index}]`)), + ); + data = { + ...data, + [input.name]: input.setData( + getValues(`${keyArrData}[${index}].${input.name}`), + ), + }; + continue; + } + + setValueItems( + input.name, + getValues(`${keyArrData}[${index}].${input.name}`), + ); + data = { + ...data, + [input.name]: getValues( + `${keyArrData}[${index}].${input.name}`, + ), + }; + } + }; + + const handleClose = () => { + setIndex && setIndex(-1); + setOpen && setOpen(false); + reset({}); + }; + + const submitItem = (data: any) => { + // CRIAR FUNÇÃO PARA TRATAR REGRAS QUE SEJA CHAMADA AQUI + + for (const input of inputs) { + if (!input?.dto) { + continue; + } + data = input.dto(data); + } + + if (index >= 0) { + update(index, { + ...data, + }); + } else { + append(data); + } + handleClose(); + }; + + return ( +
    + + + + Inserir item + +
    + submitItem(data), + )}> + + + + + + + + + +
    +
    +
    + ); +}; diff --git a/frontend/src/componets/globalFilterComponent/filterSearch.scss b/frontend/src/componets/globalFilterComponent/filterSearch.scss new file mode 100644 index 0000000..e401968 --- /dev/null +++ b/frontend/src/componets/globalFilterComponent/filterSearch.scss @@ -0,0 +1,28 @@ +.container-search { + background-color: #fff; + color: rgba(0, 0, 0, 0.87); + transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + box-shadow: 0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12); + overflow-y: auto; + display: flex; + flex-direction: column; + height: 100%; + flex: 1 0 auto; + z-index: 1100; + position: fixed; + top: 0; + outline: 0; + right: 0; + width: 300px; + + .container-inputs { + display: block; + width: 100%; + margin-top: 8px; + padding: 8px; + } +} + +.container-search-none { + display: none; +} \ No newline at end of file diff --git a/frontend/src/componets/globalFilterComponent/filterSearch.tsx b/frontend/src/componets/globalFilterComponent/filterSearch.tsx new file mode 100644 index 0000000..c73cff2 --- /dev/null +++ b/frontend/src/componets/globalFilterComponent/filterSearch.tsx @@ -0,0 +1,204 @@ +import CloseIcon from '@mui/icons-material/Close'; +import { Container, IconButton, Stack, Typography } from '@mui/material'; +import React, { useEffect, useState, useLayoutEffect } from 'react'; +import api from '../../services/api'; +import { FormAutocompleteInitialized } from '../form/formAutocompleteInitialized'; +import { FormAutocompleteMultiple } from '../form/formAutocompleteMultiple'; +import { FormButton } from '../form/formButton'; +import { FormInputText, IFormInputProps } from '../form/formInputText'; +import './filterSearch.scss'; +import QueryStringGlobal from '../queryStringGlobal'; +import { objToQuery, queryToObj, setValuesOfQuery } from '../../util/query'; +import { useHistory } from 'react-router-dom'; +import GlobalQueryString from '../globalQueryString'; +import { unixToDate } from '../../util/dateUtil'; +import { settingSetValue } from '../../util/settingSetValue'; +import { IFormInputPropsFilter } from '../interfaces/formInputPropsFilter'; + +interface IValueToBeHeart { + keyParam: string; + defaultValue: any; + implementation: (value: any) => void; + implementationClear: () => void; +} + +interface IFilterSearch { + inputs: IFormInputPropsFilter[]; + handleInputs?: IFormInputPropsFilter[]; + handleClearFilters?: () => void; + setToggleSearch: (toggleSearch: boolean) => void; + toggleSearch: boolean; + setRowsPerPage: (numb: number) => void; + setPage: (numb: number) => void; + rowsPerPage: number; + page: number; + implementationLoadRows: (queryString: string) => Promise; + updateRows: boolean; + setUpdateRows: (action: boolean) => void; + queryDefault: string; +} + +const GlobalFilterSearchComponent: React.FC = ({ + inputs, + setToggleSearch, + toggleSearch, + setRowsPerPage, + setPage, + rowsPerPage, + page, + implementationLoadRows, + updateRows, + setUpdateRows, + queryDefault, + handleInputs, +}) => { + const history = useHistory(); + + const data: any = { charCode: 13 }; + + let inputsFilter = [...inputs]; + if (handleInputs) { + inputsFilter = [...handleInputs]; + } + + function handleClearAll() { + history.push(`?${queryDefault}`); + setValuesOfQuery(queryDefault, inputs, setRowsPerPage, setPage); + implementationLoadRows(queryDefault); + } + + return ( +
    + + {/** INPUT FILTERS */} + {toggleSearch && ( +
    + + + Filtros + + + { + setToggleSearch(false); + }}> + + + + + + {inputsFilter.map((input, index) => { + if (input.typeInput === 'text') { + return ( + + ); + } + if (input.typeInput === 'autocomplete') { + return ( + + ); + } + if (input.typeInput === 'multiple') { + return ( + + ); + } + return <>; + })} + + + {window.screen.width < 800 && + inputs[0]?.handleOnKeyPress && ( + + inputs[0]?.handleOnKeyPress?.(data) + } + /> + )} + + + +
    + )} +
    + ); +}; + +export default GlobalFilterSearchComponent; diff --git a/frontend/src/componets/globalQueryString/index.tsx b/frontend/src/componets/globalQueryString/index.tsx new file mode 100644 index 0000000..7dbf11b --- /dev/null +++ b/frontend/src/componets/globalQueryString/index.tsx @@ -0,0 +1,86 @@ +import { useEffect, useState } from 'react'; +import { useHistory } from 'react-router-dom'; +import { queryToObj, setValuesOfQuery } from '../../util/query'; +import { IFormInputPropsFilter } from '../interfaces/formInputPropsFilter'; +import { settingSetValue } from '../../util/settingSetValue'; + +interface IProps { + setRowsPerPage: (numb: number) => void; + setPage: (numb: number) => void; + rowsPerPage: number; + page: number; + implementationLoadRows: (queryString: string) => Promise; + updateRows: boolean; + setUpdateRows: (action: boolean) => void; + queryDefault: string; + inputs: IFormInputPropsFilter[]; +} + +const GlobalQueryString: React.FC = ({ + implementationLoadRows, + updateRows, + setUpdateRows, + queryDefault, + inputs, + setRowsPerPage, + setPage, +}) => { + const history = useHistory(); + const [execQueryDefault, setExecQsueryDefault] = useState(false); + + useEffect(() => { + if (updateRows) { + setValuesOfWindowLocationSearch( + window.location.search.replace('?', ''), + ); + implementationLoadRows(window.location.search.replace('?', '')); + setUpdateRows(false); + } + }, [updateRows]); + + useEffect(() => { + if (!execQueryDefault) { + if ( + window.location.search && + window.location.search.replace('?', '') !== queryDefault + ) { + setValuesOfWindowLocationSearch( + window.location.search.replace('?', ''), + ); + implementationLoadRows(window.location.search.replace('?', '')); + } else { + setValuesOfQuery(queryDefault, inputs, setRowsPerPage, setPage); + implementationLoadRows(queryDefault); + history.replace(`?${queryDefault}`); + } + setExecQsueryDefault(true); + } + }, [execQueryDefault]); + + async function setValuesOfWindowLocationSearch(query: string) { + const objOfQuery = queryToObj(query); + const keys = Object.keys(objOfQuery); + + for (const k of keys) { + const input = inputs.find( + i => i.name === k || i?.aliasToQuery === k, + ); + + if (input) { + settingSetValue[input.typeInput](objOfQuery[k], input); + } + + if (k === 'page') { + setPage(Number(objOfQuery[k])); + } + + if (k === 'size') { + setRowsPerPage(Number(objOfQuery[k])); + } + } + } + + return <>; +}; + +export default GlobalQueryString; diff --git a/frontend/src/componets/icons/index.tsx b/frontend/src/componets/icons/index.tsx new file mode 100644 index 0000000..54ef6ea --- /dev/null +++ b/frontend/src/componets/icons/index.tsx @@ -0,0 +1,72 @@ +import * as IconsMaterial from '@mui/icons-material'; +import { SvgIcon, SvgIconProps } from '@mui/material'; + +export interface IButtonProps extends SvgIconProps { + icon: any; + width?: number; + height?: number; +} + +export const icons = { + DownloadDone: IconsMaterial.DownloadDone, + NotInterested: IconsMaterial.NotInterested, + CurrencyExchange: IconsMaterial.CurrencyExchange, + Paid: IconsMaterial.Paid, + PriceCheck: IconsMaterial.PriceCheck, + EventNote: IconsMaterial.EventNote, + Close: IconsMaterial.Close, + RequestQuote: IconsMaterial.RequestQuote, + Print: IconsMaterial.Print, + InstallDesktop: IconsMaterial.InstallDesktop, + ClearAll: IconsMaterial.ClearAll, + ModeEdit: IconsMaterial.ModeEdit, + Delete: IconsMaterial.Delete, + Search: IconsMaterial.Search, + AddCircle: IconsMaterial.AddCircle, + Functions: IconsMaterial.Functions, + SwipeRight: IconsMaterial.SwipeRight, + PermIdentityOutlined: IconsMaterial.PermIdentityOutlined, + LockOutlined: IconsMaterial.LockOutlined, + BusinessCenter: IconsMaterial.BusinessCenter, + MoneyOff: IconsMaterial.MoneyOff, + MoneyOffCsred: IconsMaterial.MoneyOffCsred, + Cable: IconsMaterial.Cable, + PriceChange: IconsMaterial.PriceChange, + PaidTwoTone: IconsMaterial.PaidTwoTone, + Archive: IconsMaterial.Archive, + Business: IconsMaterial.Business, + Check: IconsMaterial.Check, + AddCard: IconsMaterial.AddCard, + AccountCircle: IconsMaterial.AccountCircle, + AccountBox: IconsMaterial.AccountBox, + EditRoad: IconsMaterial.EditRoad, + MemoryOutlined: IconsMaterial.MemoryOutlined, + Dashboard: IconsMaterial.Dashboard, + Flag: IconsMaterial.Flag, + StickyNote2: IconsMaterial.StickyNote2, + GraphicEq: IconsMaterial.GraphicEq, + AccountTree: IconsMaterial.AccountTree, + ReportGmailerrorred: IconsMaterial.ReportGmailerrorred, + Groups: IconsMaterial.Groups, + Summarize: IconsMaterial.Summarize, + PhonelinkRing: IconsMaterial.PhonelinkRing, + PlaylistAddCheck: IconsMaterial.PlaylistAddCheck, + FilterList: IconsMaterial.FilterList, + StarBorder: IconsMaterial.StarBorder, + Star: IconsMaterial.Star, + FormatColorFill: IconsMaterial.FormatColorFill, + EditOutlined: IconsMaterial.EditOutlined, + ChevronLeft: IconsMaterial.ChevronLeft, + ChevronRight: IconsMaterial.ChevronRight, +}; + +export const IconComponent = (properties: IButtonProps) => { + return ( + + ); +}; diff --git a/frontend/src/componets/interfaces/formInputPropsFilter.ts b/frontend/src/componets/interfaces/formInputPropsFilter.ts new file mode 100644 index 0000000..5f4dd09 --- /dev/null +++ b/frontend/src/componets/interfaces/formInputPropsFilter.ts @@ -0,0 +1,24 @@ +import { IFormInputProps } from '../form/formInputText'; + +export interface IFormInputPropsFilter extends IFormInputProps { + typeInput: 'text' | 'date' | 'autocomplete' | 'multiple'; + mask?: + | 'phone' + | 'number' + | 'identification' + | 'cep' + | 'toUpperCase' + | undefined; + loadingAutocomplete?: boolean; + options?: any[]; + setValue?: any; + getValues?: (name: string) => any | any[] | undefined; + // query?: string; + handleChange?: any; + handleOnKeyPress?: (data: any, input?: string) => void; + entityPath?: string; + keyQuery?: string; + aliasToQuery?: string; + query?: (value: string) => string; + DAODataList?: (value: any) => any; +} diff --git a/frontend/src/componets/interfaces/formProps.ts b/frontend/src/componets/interfaces/formProps.ts new file mode 100644 index 0000000..2c8f709 --- /dev/null +++ b/frontend/src/componets/interfaces/formProps.ts @@ -0,0 +1,36 @@ +import * as React from 'react'; +import { + DeepPartial, + FieldValues, + UnpackNestedValue, + UseFormSetValue, +} from 'react-hook-form'; +import { FormInputProps } from '../form/formInterfaces'; + +export interface IFormSettinsProps { + settings: any; +} + +export interface IFormProps { + settings: any; + defaultValues: UnpackNestedValue>; + inputsForm: FormInputProps[]; + implSetValueData?: (data: any) => void; + callbackSuccess?: (data: any) => void; + configDataFooter?: { + dataFooter?: (data: any) => any; + nameFields: string; + }; +} + +export interface ImperativeHandleAccessedByParentComponent< + T extends FieldValues, +> { + setValue: UseFormSetValue; + handleClick: (index: number, name: string) => void; + handleDeleteItemTable: (index: number, name: string) => void; + handleNewItemTable: (name: string) => void; + dynamicFieldArrays: any; + setValueInput: ({ value, field }: { value: any; field: string }) => void; + watch: any; +} diff --git a/frontend/src/componets/interfaces/listProps.ts b/frontend/src/componets/interfaces/listProps.ts new file mode 100644 index 0000000..da899c9 --- /dev/null +++ b/frontend/src/componets/interfaces/listProps.ts @@ -0,0 +1,29 @@ +import { ColumnDef } from '@tanstack/react-table'; +import { DeepPartial, FieldValues, UnpackNestedValue } from 'react-hook-form'; +import { IFormInputPropsFilter } from './formInputPropsFilter'; +import { FormInputProps } from '../form/formInterfaces'; + +export interface IPropsList { + settings: any; + defaultValues: UnpackNestedValue>; + columnsTable: ColumnDef[]; + inputsFilter: IFormInputPropsFilter[]; + QUERY_DEFAULT: string; + mainInputsFilter: FormInputProps[]; +} + +export interface ImperativeHandleAccessedByParentListComponent { + handleClick: (id: string) => void; + handleByOnKeyPressEnterNewQuery: (value: any, name: string) => void; + setIdDelete: (idDelete: string) => void; + setOpenModalDelete: (open: boolean) => void; + handleEdit: (idDelete: string) => void; + setToggleSearch: (open: boolean) => void; + control: any; + setValue: any; + clearErrors: any; + setError: any; + setUpdateRows: (updateRows: boolean) => void; + loadRows: (query: string) => Promise; + handleClearDates: (keys: string[]) => void; +} diff --git a/frontend/src/componets/list/index.tsx b/frontend/src/componets/list/index.tsx new file mode 100644 index 0000000..5e282af --- /dev/null +++ b/frontend/src/componets/list/index.tsx @@ -0,0 +1,416 @@ +import React from 'react'; +import { Grid, IconButton, Stack, Tooltip } from '@mui/material'; +import Box from '@mui/material/Box'; +import Paper from '@mui/material/Paper'; +import TablePagination from '@mui/material/TablePagination'; +import Typography from '@mui/material/Typography'; +import { + DeepPartial, + FieldValues, + Path, + UnpackNestedValue, + useForm, +} from 'react-hook-form'; +import { useHistory, useLocation } from 'react-router-dom'; + +import { defaultLabelDisplayedRows } from '../../communs/tablePaginationAssistant'; +import AlertDialog from '../../componets/dialog/alertDialog'; +import { FormButton } from '../../componets/form/formButton'; +import { rowsPerPageOptions } from '../../config'; +import { useContextGlobal } from '../../context/ContextGlobal'; +import { useToast } from '../../context/ToastContext'; +import api from '../../services/api'; +import { handleExceptionMessage } from '../../util/handleExceptionAxios'; +import { message } from '../../util/handleMessages'; +import { + handleChangePage, + handleChangeRowsPerPage, + objToQuery, + queryToObj, +} from '../../util/query'; +import { TableGeneric } from '../../componets/table'; +import { FormInputText } from '../../componets/form/formInputText'; +import QueryStringGlobal from '../../componets/queryStringGlobal'; +import { IFormInputPropsFilter } from '../../componets/interfaces/formInputPropsFilter'; +import { + IPropsList, + ImperativeHandleAccessedByParentListComponent, +} from '../interfaces/listProps'; +import './styles.scss'; +import RenderForm from '../form/renderForm'; +import { IconComponent, icons } from '../icons'; +import { FormInputProps } from '../form/formInterfaces'; +import GlobalFilterSearchComponent from '../globalFilterComponent/filterSearch'; + +interface IFormInput extends FieldValues { + description: string; +} + +interface IStackComponent { + mainInputs: FormInputProps[]; + inputs: IFormInputPropsFilter[]; + setToggleSearch: (open: boolean) => void; + handleClearDates: (keys: string[]) => void; +} + +const StackComponent = (props: IStackComponent) => { + const { mainInputs, inputs, setToggleSearch, handleClearDates } = props; + + if (mainInputs.length === 0 && inputs[0].control) { + return ( + + ); + } + + if (mainInputs.length > 0) { + return ( + <> + + + + {inputs.length > 0 && ( + setToggleSearch(true)}> + + + + + )} + + ); + } + + return <>; +}; + +const ListComponet = React.forwardRef( + ( + props: IPropsList, + ref?: React.Ref, + ) => { + const { + settings, + defaultValues, + columnsTable, + inputsFilter, + QUERY_DEFAULT, + mainInputsFilter, + } = props; + + const [page, setPage] = React.useState(0); + const [rowsPerPage, setRowsPerPage] = React.useState(0); + const [rows, setRows] = React.useState([]); + const [total, setTotal] = React.useState(0); + const [toggleSearch, setToggleSearch] = React.useState(false); + const [deleteRegister, setDeleteRegister] = + React.useState(false); + const [openModalDelete, setOpenModalDelete] = React.useState(false); + const [idDelete, setIdDelete] = React.useState(''); + + const history = useHistory(); + const { search } = useLocation(); + const { setOpenLoading } = useContextGlobal(); + const { addToast } = useToast(); + + const { control, setValue, clearErrors, setError } = useForm({ + defaultValues, + }); + + const inputs = React.useMemo( + () => [ + ...inputsFilter.map(i => ({ + ...i, + setValue, + control, + })), + ], + [inputsFilter, setValue, control], + ); + + const mainInputs = React.useMemo[]>( + () => [ + ...mainInputsFilter.map(i => ({ + ...i, + setValue, + control, + setError, + clearErrors, + })), + ], + [mainInputsFilter, setValue, control, setError, clearErrors], + ); + + const loadRows = React.useCallback( + async (queryString: string): Promise => { + setOpenLoading(true); + try { + const response = await api.get( + `${settings.apiPath}?${queryString}`, + ); + setRows(response.data.content); + setTotal(response.data.totalElements); + setOpenLoading(false); + if (deleteRegister) { + setDeleteRegister(false); + } + } catch (error) { + const messageResponse = handleExceptionMessage(error); + addToast({ + type: 'error', + title: message.error.selectAll, + description: messageResponse, + }); + setOpenLoading(false); + } + }, + [addToast, deleteRegister, setOpenLoading, settings], + ); + + const handleEdit = React.useCallback( + (id: string) => { + history.push(`${settings.pathRegister}/${id}`); + }, + [history, settings], + ); + + const handleClick = React.useCallback( + (id: string) => { + handleEdit(id); + }, + [handleEdit], + ); + + // HANDLER LOAD NEW QUERY FILTER + const handleByOnKeyPressEnterNewQuery = React.useCallback( + (value: any, name: string) => { + const queryObj = queryToObj(search.replace('?', '')); + + const newQuery = { + ...queryObj, + [name]: value, + page: 0, + }; + const nQuery = objToQuery(newQuery); + history.push(`?${nQuery}`); + loadRows(nQuery); + + if (window.screen.width < 900) { + setToggleSearch(false); + } + }, + [history, search, loadRows], + ); + + const handleClearDates = React.useCallback( + (keys: string[]) => { + let queryT = search.replace('?', ''); + const objQuery = queryToObj(queryT); + + setTimeout(() => { + keys.forEach((key: any) => { + setValue(key, null); + setValue(key, null); + }); + }, 200); + + delete objQuery.dateInitial; + delete objQuery.dateFinal; + + queryT = objToQuery(objQuery); + history.push(`?${queryT}`); + setDeleteRegister(true); + }, + [history, search, setValue], + ); + + React.useImperativeHandle( + ref, + () => ({ + handleClick, + handleByOnKeyPressEnterNewQuery, + setIdDelete, + setOpenModalDelete, + handleEdit, + setToggleSearch, + control, + setValue, + clearErrors, + setError, + setUpdateRows: setDeleteRegister, + loadRows, + handleClearDates, + }), + [ + handleClick, + handleByOnKeyPressEnterNewQuery, + setOpenModalDelete, + handleEdit, + setToggleSearch, + control, + setValue, + clearErrors, + setError, + setDeleteRegister, + loadRows, + handleClearDates, + ], + ); + + const handleDelete = async (id: string) => { + setOpenLoading(true); + + try { + await api.delete(`${settings.apiPath}/${id}`); + addToast({ + type: 'success', + title: message.success.delete, + description: '', + }); + setPage(0); + setRowsPerPage(rowsPerPageOptions[0]); + setDeleteRegister(true); + } catch (error: any) { + const messageResponse = handleExceptionMessage(error); + setOpenLoading(false); + addToast({ + type: 'error', + title: message.error.delete, + description: messageResponse, + }); + } + }; + + const handleConfirmeDelete = async (confirm: boolean) => { + if (confirm) { + setOpenModalDelete(false); + handleDelete(idDelete); + setIdDelete(''); + } else { + setOpenModalDelete(false); + setIdDelete(''); + } + }; + + return ( +
    + + + +
    +
    + + {settings.title} + +
    +
    + + + +
    +
    + + + history.push(settings.pathRegister) + } + /> + + + 0 ? page : 0} + onPageChange={(event: unknown, newPage: number) => + handleChangePage( + event, + newPage, + setPage, + history, + loadRows, + ) + } + onRowsPerPageChange={( + event: React.ChangeEvent, + ) => + handleChangeRowsPerPage( + event, + setRowsPerPage, + setPage, + history, + loadRows, + ) + } + /> +
    +
    + + + {/* */} +
    + ); + }, +); + +export default ListComponet; diff --git a/frontend/src/componets/list/styles.scss b/frontend/src/componets/list/styles.scss new file mode 100644 index 0000000..265841b --- /dev/null +++ b/frontend/src/componets/list/styles.scss @@ -0,0 +1,39 @@ +.principal-container-component-list { + display: flex; + flex-direction: column; + width: 100%; + margin: 0 !important; + max-width: none !important; + + .header-list { + padding: 16px; + display: flex; + align-items: center; + justify-content: space-between; + + + @media (max-width: 600px){ + padding: 8px; + display: block; + + .header-list-title { + padding-bottom: 8px; + } + } + } + + .header-list-search { + @media (min-width: 600px){ + width: 400px; + } + display: flex; + align-items: flex-end; + justify-content: end; + margin-right: 0; + + } +} + +.container-box { + margin: 0 288px 0 0 !important; +} diff --git a/frontend/src/componets/queryStringGlobal/index.tsx b/frontend/src/componets/queryStringGlobal/index.tsx new file mode 100644 index 0000000..9823eee --- /dev/null +++ b/frontend/src/componets/queryStringGlobal/index.tsx @@ -0,0 +1,86 @@ +import { useEffect, useState } from 'react'; +import { useHistory } from 'react-router-dom'; +import { queryToObj, setValuesOfQuery } from '../../util/query'; +import { IFormInputPropsFilter } from '../interfaces/formInputPropsFilter'; +import { settingSetValue } from '../../util/settingSetValue'; + +interface IProps { + setRowsPerPage: (numb: number) => void; + setPage: (numb: number) => void; + rowsPerPage: number; + page: number; + implementationLoadRows: (queryString: string) => Promise; + updateRows: boolean; + setUpdateRows: (action: boolean) => void; + queryDefault: string; + inputs: IFormInputPropsFilter[]; +} + +const GlobalQueryString: React.FC = ({ + implementationLoadRows, + updateRows, + setUpdateRows, + queryDefault, + inputs, + setRowsPerPage, + setPage, +}) => { + const history = useHistory(); + const [execQueryDefault, setExecQsueryDefault] = useState(false); + + useEffect(() => { + if (updateRows) { + setValuesOfWindowLocationSearch( + window.location.search.replace('?', ''), + ); + implementationLoadRows(window.location.search.replace('?', '')); + setUpdateRows(false); + } + }, [updateRows]); + + useEffect(() => { + if (!execQueryDefault) { + if ( + window.location.search && + window.location.search.replace('?', '') !== queryDefault + ) { + setValuesOfWindowLocationSearch( + window.location.search.replace('?', ''), + ); + implementationLoadRows(window.location.search.replace('?', '')); + } else { + setValuesOfQuery(queryDefault, inputs, setRowsPerPage, setPage); + implementationLoadRows(queryDefault); + history.push(`?${queryDefault}`); + } + setExecQsueryDefault(true); + } + }, [execQueryDefault]); + + async function setValuesOfWindowLocationSearch(query: string) { + const objOfQuery = queryToObj(query); + const keys = Object.keys(objOfQuery); + + for (const k of keys) { + const input = inputs.find( + i => i.name === k || i?.aliasToQuery === k, + ); + + if (input) { + settingSetValue[input.typeInput](objOfQuery[k], input); + } + + if (k === 'page') { + setPage(Number(objOfQuery[k]) - 1); + } + + if (k === 'size') { + setRowsPerPage(Number(objOfQuery[k])); + } + } + } + + return <>; +}; + +export default GlobalQueryString; diff --git a/frontend/src/componets/queryStringGlobalBackup/index.tsx b/frontend/src/componets/queryStringGlobalBackup/index.tsx new file mode 100644 index 0000000..e878bb9 --- /dev/null +++ b/frontend/src/componets/queryStringGlobalBackup/index.tsx @@ -0,0 +1,113 @@ +import { useEffect, useState } from 'react'; +import { useHistory, useLocation, useParams } from 'react-router-dom'; +import { objToQuery, queryToObj } from '../../util/query'; +import { rowsPerPageOptions } from '../../config'; + +interface IValueToBeHeart { + keyParam: string; + defaultValue: any; + implementation: (value: any) => void; + implementationClear: () => void; +} + +interface IProps { + setRowsPerPage: (numb: number) => void; + setPage: (numb: number) => void; + rowsPerPage: number; + page: number; + initialValues: any; + implementationLoadRows: (queryString: string) => Promise; + valuesToBeHeart: IValueToBeHeart[]; + loadRows: boolean; +} + +const QueryStringGlobal: React.FC = ({ + setRowsPerPage, + setPage, + rowsPerPage, + page, + initialValues, + implementationLoadRows, + valuesToBeHeart, + loadRows, +}) => { + const history = useHistory(); + const { search } = useLocation(); + const [execQueryDefault, setExecQueryDefault] = useState(false); + const params = useParams<{ id?: string }>(); + + const [query, setQuery] = useState(''); + + useEffect(() => { + let queryT = ''; + if (search && search.length > 0 && (!params || !params.id)) { + const { size, pageParam } = getParams(); + setRowsPerPage(Number(size)); + setPage(Number(pageParam - 1)); + queryT = search.replace('?', ''); + setQuery(queryT); + } else if (rowsPerPage === 0 && (!params || !params.id)) { + const queryTemp = objToQuery(initialValues); + history.push(`?${queryTemp}`); + } + + if (queryT.length > 0) { + implementationLoadRows(queryT); + setParams(queryT); + } + }, [search]); + + useEffect(() => { + let paramsQueryString = getParams(); + const { size, pageParam } = paramsQueryString; + if (size != rowsPerPage || pageParam != page + 1) { + paramsQueryString.page = page + 1; + paramsQueryString.size = rowsPerPage > 0 ? rowsPerPage : size; + const { pageParam, ...params } = paramsQueryString; + const queryTemp = objToQuery(params); + history.push(`?${queryTemp}`); + } + }, [page, rowsPerPage]); + + useEffect(() => { + if (loadRows) { + implementationLoadRows(query); + } + }, [loadRows]); + + function getParams(): any { + let paramsQueryString: any = {}; + + for (const valueToBeHeart of valuesToBeHeart) { + paramsQueryString = { + ...paramsQueryString, + [valueToBeHeart.keyParam]: valueToBeHeart.defaultValue, + }; + } + + if (search && search.length > 0) { + paramsQueryString = queryToObj(search.replace('?', '')); + } + + if (paramsQueryString.page) { + paramsQueryString.pageParam = Number(paramsQueryString.page) || 0; + } + return paramsQueryString; + } + + // Parâmetros de consulta padrão, para atualizar campos quando é dado um refresh na página + function setParams(queryString: string) { + const objQuery = queryToObj(queryString); + const keys = Object.keys(objQuery); + for (const key of keys) { + const findKey = valuesToBeHeart.find(v => v.keyParam === key); + if (findKey) { + findKey.implementation(objQuery[key]); + } + } + } + + return <>; +}; + +export default QueryStringGlobal; diff --git a/frontend/src/componets/search/index.tsx b/frontend/src/componets/search/index.tsx new file mode 100644 index 0000000..81ee7dc --- /dev/null +++ b/frontend/src/componets/search/index.tsx @@ -0,0 +1,109 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import List from '@mui/material/List'; +import Divider from '@mui/material/Divider'; +import ListItem from '@mui/material/ListItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import InboxIcon from '@mui/icons-material/MoveToInbox'; +import MailIcon from '@mui/icons-material/Mail'; +import { styled, createTheme, ThemeProvider } from "@mui/material/styles"; +import MuiDrawer from "@mui/material/Drawer"; + +type Anchor = 'top' | 'left' | 'bottom' | 'right'; + +export default function TemporaryDrawer() { + const [state, setState] = React.useState({ + top: false, + left: false, + bottom: false, + right: false, + }); + + const toggleDrawer = + (anchor: Anchor, open: boolean) => + (event: React.KeyboardEvent | React.MouseEvent) => { + if ( + event.type === 'keydown' && + ((event as React.KeyboardEvent).key === 'Tab' || + (event as React.KeyboardEvent).key === 'Shift') + ) { + return; + } + + setState({ ...state, [anchor]: open }); + }; + + const list = (anchor: Anchor) => ( + + + {['Inbox', 'Starred', 'Send email', 'Drafts'].map((text, index) => ( + + + {index % 2 === 0 ? : } + + + + ))} + + + + {['All mail', 'Trash', 'Spam'].map((text, index) => ( + + + {index % 2 === 0 ? : } + + + + ))} + + + ); + + const mdTheme = createTheme(); + + const Drawer = styled(MuiDrawer, {})(({ theme, open }) => ({ + zIndex: theme.zIndex.drawer + 1, + "& .MuiDrawer-paper": { + // position: "relative", + whiteSpace: "nowrap", + transition: theme.transitions.create("width", { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.enteringScreen, + }), + boxSizing: "border-box", + + }, + })); + + return ( + + {(['left', 'right', 'top', 'bottom'] as const).map((anchor) => ( + + + + {list(anchor)} + + + ))} + + ); +} \ No newline at end of file diff --git a/frontend/src/componets/table/index.tsx b/frontend/src/componets/table/index.tsx new file mode 100644 index 0000000..6ad1904 --- /dev/null +++ b/frontend/src/componets/table/index.tsx @@ -0,0 +1,316 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { + Grid, + Paper, + Popover, + TabScrollButton, + Table, + TableBody, + TableCell, + TableCellProps, + TableContainer, + TableHead, + TableRow, + Typography, +} from '@mui/material'; +import { + getCoreRowModel, + useReactTable, + ColumnDef, + flexRender, +} from '@tanstack/react-table'; +import { makeStyles } from '@mui/styles'; +import { useWindowSize } from '../../util/responsiveness'; + +// import './styles.scss'; + +const useStyles = makeStyles({ + root: { + width: '100%', + borderCollapse: 'collapse', + overflow: 'hidden', // Para esconder a barra de rolagem da tabela + }, + tbody: { + display: 'block', // Permite definir uma altura máxima para o tbody + maxHeight: 'calc(100vh - 64px)', // Ajuste conforme necessário + overflowY: 'auto', // Adiciona uma barra de rolagem apenas ao tbody + }, + headerRow: { + whiteSpace: 'nowrap', // Impedindo quebras de linha no cabeçalho + }, +}); + +interface MyComponentProps { + cellProps?: TableCellProps; +} + +const MyComponent: React.FC = () => { + return ( + <> + + + + {columns.map(column => ( + + {column.label} + + ))} + + +
    + + + + {[...Array(50)].map((_, index) => ( + + + Dato {index + 1}, Columna 1 + + + Dato {index + 1}, Columna 2 + + + ))} + +
    +
    + + ); +}; + +const generateItems = (amount: any) => { + const arr = Array.from(Array(amount)); + return arr.map((number, i) => ({ + id: i, + name: `Name ${i + 1}`, + type: `Item Type ${i + 1}`, + })); +}; +const TableWithInfiniteScroll = () => { + const [rows, setRows] = useState(generateItems(50)); + return ( + + + + + Name + Type + + + + {rows.map(({ id, name, type }) => ( + + {name} + {type} + + ))} + +
    +
    + ); +}; +// const MyComponent: React.FC = ({ cellProps }) => { +// const tableRef = useRef(null); +// const classes = useStyles(); + +// useEffect(() => { +// // Atualizando as larguras das células do corpo da tabela para corresponder às do cabeçalho +// if (tableRef.current) { +// const headerCells = +// tableRef.current.querySelectorAll('thead > tr > th'); +// const bodyCells = +// tableRef.current.querySelectorAll('tbody > tr > td'); + +// headerCells.forEach((headerCell, index) => { +// const width = headerCell.clientWidth; +// bodyCells[index].style.width = `${width}px`; +// }); +// } +// }, []); + +// return ( +// +// +// +// Encabezado 1 +// Encabezado 2 +// +// +// +// {[...Array(50)].map((_, index) => ( +// +// +// Dato {index + 1}, Columna 1 +// +// +// Dato {index + 1}, Columna 2 +// +// +// ))} +// +//
    +// ); +// }; + +export interface ReactTableProps { + data: T[]; + columns: ColumnDef[]; + minWidth: string | number; + sxTableContainer?: any; + cursor?: string; +} + +const columns = [ + { + id: 'name', + align: 'left', + label: 'Nome', + }, + { + id: 'name', + align: 'left', + label: 'Nome', + }, +]; + +// const Table = React.forwardRef< +// HTMLTableElement, +// React.HTMLAttributes +// >(({ className, ...props }, ref) => ( +// +// )); +// Table.displayName = 'Table'; +// const TableHeader = React.forwardRef< +// HTMLTableSectionElement, +// React.HTMLAttributes +// >(({ className, ...props }, ref) => ( +// +// )); +// TableHeader.displayName = 'TableHeader'; + +export const TableGeneric = ({ + data, + columns, + minWidth, + sxTableContainer, + cursor, +}: ReactTableProps) => { + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + }); + + const tableRef = useRef(null); + + if (data?.length === 0) { + return ( +
    + + Nenhum registro encontrado + +
    + ); + } + + if (data.length > 0) { + tableRef?.current?.scrollTo(0, 0); + } + return ( + +
    + + + {table.getHeaderGroups().map(headerGroup => { + return headerGroup.headers.map( + (header: any, i: number) => { + const props: any = header.getContext(); + props.key = i; + return header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + props, + ); + }, + ); + })} + + + + {table.getRowModel().rows.map((row, index) => ( + + {row.getVisibleCells().map((cell, index) => { + const key = index; + const props: any = cell.getContext(); + props.key = key; + return flexRender( + cell.column.columnDef.cell, + props, + ); + })} + + ))} + +
    + + ); +}; diff --git a/frontend/src/config.ts b/frontend/src/config.ts new file mode 100644 index 0000000..bba723e --- /dev/null +++ b/frontend/src/config.ts @@ -0,0 +1,20 @@ +export const paths = { + user: '/records/user', + userRegister: '/records/user/register', + task: '/records/task', + taskRegister: '/records/task/register', +}; + +export const rowsPerPageOptions = [15, 50, 100]; + +export const urls = { + api: { + local: 'http://localhost:8080', + prod: 'http://localhost:8080', + }, +}; + +export const texts = { + nameSystem: 'CoreNotes - Gestão de tarefas', + info: 'Gerenciamento de tarefas', +}; diff --git a/frontend/src/context/AuthContext.tsx b/frontend/src/context/AuthContext.tsx new file mode 100755 index 0000000..e739ff8 --- /dev/null +++ b/frontend/src/context/AuthContext.tsx @@ -0,0 +1,115 @@ +import jwtDecode from 'jwt-decode'; +import React, { + createContext, + useCallback, + useContext, + useEffect, + useState, +} from 'react'; + +import api from '../services/api'; +import { getUnixTime } from 'date-fns'; + +interface User { + sub: string; + name: string; + username: string; + authorities: any; +} +interface AuthState { + token: string; + user: User; +} +interface SignInCredentials { + username: string; + password: string; +} +interface AuthContextData { + user: User; + signIn(credentials: SignInCredentials): Promise; + signOut(): void; + updateUser(user: User): void; +} + +type Props = { children: React.ReactNode }; + +export const AuthContext = createContext( + {} as AuthContextData, +); + +export const AuthProvider: React.FC = ({ children }) => { + useEffect(() => { + const token = localStorage.getItem('@CORELAB:token'); + auxSetToken(token); + api.defaults.headers.common['Authorization'] = `Bearer ${token}`; + }, []); + + const auxSetToken = async (token: any) => { + if (token) { + const user: User = await jwtDecode(token); + setData({ user, token: token }); + } + }; + + const [data, setData] = useState(() => { + const token = localStorage.getItem('@CORELAB:token'); + if (token) { + const user: User = jwtDecode(token); + if (user) { + api.defaults.headers.common[ + 'Authorization' + ] = `Bearer ${token}`; + return { token, user: user }; + } + } + return {} as AuthState; + }); + + const signIn = async ({ username, password }: SignInCredentials) => { + const response = await api.post('login', { + username, + password, + }); + const { token } = response.data; + const user: User = jwtDecode(token); + localStorage.setItem('@CORELAB:token', token); + api.defaults.headers.common['Authorization'] = `Bearer ${token}`; + setData({ token, user }); + }; + + const signOut = useCallback(() => { + localStorage.removeItem('@CORELAB:token'); + localStorage.removeItem('@CORELAB:refreshToken'); + localStorage.removeItem('@CORELAB:openCollapsePermissions'); + setData({} as AuthState); + }, []); + + const updateUser = useCallback( + (user: User) => { + localStorage.setItem('@CORELAB:user', JSON.stringify(user)); + setData({ + token: data.token, + user, + }); + }, + [setData, data.token], + ); + + return ( + + {children} + + ); +}; + +export function useAuth(): AuthContextData { + const context = useContext(AuthContext); + + return context; +} diff --git a/frontend/src/context/ContextGlobal.tsx b/frontend/src/context/ContextGlobal.tsx new file mode 100755 index 0000000..e5932ac --- /dev/null +++ b/frontend/src/context/ContextGlobal.tsx @@ -0,0 +1,116 @@ +import { Backdrop, CircularProgress } from '@mui/material'; +import React, { createContext, useCallback, useContext, useState } from 'react'; +import io from 'socket.io-client'; + +import api from '../services/api'; +import { useAuth } from './AuthContext'; +import { urls } from '../config'; +import { ITask } from '../communs/interfaces'; +import { handleExceptionMessage } from '../util/handleExceptionAxios'; +import { message } from '../util/handleMessages'; +import { useToast } from './ToastContext'; +import { useLocation } from 'react-router-dom'; + +interface ContextData { + setOpenLoading(open: boolean): void; + handleOpenCollapseRecords(open: boolean): void; + openCollapseRecords: boolean; + tasks: ITask[]; + setTasks: (tasks: ITask[]) => void; + loadRows: (queryString: string) => Promise; + totalPages: number; + setUpdateRows: (updated: boolean) => void; + updateRows: boolean; +} + +type Props = { children: React.ReactNode }; + +const ContextGlobal = createContext({} as ContextData); + +const ProviderGlobal: React.FC = ({ children }) => { + const [open, setOpen] = useState(false); + const [tasks, setTasks] = useState([]); + const [totalPages, setTotalPages] = useState(0); + const [updateRows, setUpdateRows] = useState(false); + + const [openCollapseRecords, setOpenCollapseRecords] = useState(() => { + const openCollapseRecords = localStorage.getItem( + '@CORELAB:openCollapseRecords', + ); + + if (openCollapseRecords) { + return true; + } + return false; + }); + + const { pathname } = useLocation(); + const { addToast } = useToast(); + + const handleOpenCollapseRecords = (value: boolean) => { + if (value) { + localStorage.setItem('@CORELAB:openCollapseRecords', 'true'); + setOpenCollapseRecords(true); + } else { + localStorage.removeItem('@CORELAB:openCollapseRecords'); + setOpenCollapseRecords(false); + } + }; + + const loadRows = React.useCallback( + async (queryString: string) => { + if (pathname === '/dashboard') { + try { + setOpen(true); + const response = await api.get(`task?${queryString}`); + setTasks(response.data.content); + setTotalPages(response.data.totalPages); + } catch (error) { + const messagesResponse = handleExceptionMessage(error); + addToast({ + type: 'error', + title: message.error.selectAll, + description: messagesResponse, + }); + } + setOpen(false); + } + }, + [addToast, pathname], + ); + + return ( + + theme.zIndex.drawer + 1300, + }} + open={open}> + + + {children} + + ); +}; + +function useContextGlobal(): ContextData { + const context = useContext(ContextGlobal); + if (!context) { + throw new Error('useToast must be used within a ProviderGlobal'); + } + return context; +} + +export { ProviderGlobal, useContextGlobal }; diff --git a/frontend/src/context/ToastContext.tsx b/frontend/src/context/ToastContext.tsx new file mode 100755 index 0000000..72dac2c --- /dev/null +++ b/frontend/src/context/ToastContext.tsx @@ -0,0 +1,57 @@ +import React, { createContext, useContext, useCallback, useState } from 'react'; +import ToastContainer from '../componets/ToastContainer'; + +interface ToastContextData { + addToast(message: Omit): void; + removeToast(id: string): void; +} + +export interface ToastMessage { + id: string; + type: 'success' | 'error' | 'info' | 'warn'; + title: string; + description?: string; +} + +type Props = { children: React.ReactNode }; + +const ToastContext = createContext({} as ToastContextData); + +const ToastProvider: React.FC = ({ children }) => { + const [messages, setMessages] = useState([]); + const addToast = useCallback( + ({ type, title, description }: Omit) => { + const id = String(Math.floor(Math.random() * 300000000)); + const toast = { + id, + type, + title, + description, + }; + setMessages(oldMessages => [...oldMessages, toast]); + }, + [], + ); + + const removeToast = useCallback((id: string) => { + setMessages(oldMessages => + oldMessages.filter(message => message.id !== id), + ); + }, []); + return ( + + {children} + + + ); +}; + +function useToast(): ToastContextData { + const context = useContext(ToastContext); + if (!context) { + throw new Error('useToast must be used within a ToastProvider'); + } + return context; +} + +export { ToastProvider, useToast }; diff --git a/frontend/src/context/index.tsx b/frontend/src/context/index.tsx new file mode 100755 index 0000000..bd2bf7a --- /dev/null +++ b/frontend/src/context/index.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { AuthProvider } from './AuthContext'; +import { ProviderGlobal } from './ContextGlobal'; +import { ToastProvider } from './ToastContext'; + +type Props = { children: React.ReactNode }; + +const AppProvider: React.FC = ({ children }) => ( + + + {children} + + +); + +export default AppProvider; diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000..ec2585e --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx new file mode 100644 index 0000000..8710c77 --- /dev/null +++ b/frontend/src/index.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot( + document.getElementById('root') as HTMLElement, +); +root.render( + // + // + // , + , +); + +// 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/frontend/src/logo.svg b/frontend/src/logo.svg new file mode 100644 index 0000000..9dfc1c0 --- /dev/null +++ b/frontend/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/pages/dashboard/index.tsx b/frontend/src/pages/dashboard/index.tsx new file mode 100644 index 0000000..3d5c314 --- /dev/null +++ b/frontend/src/pages/dashboard/index.tsx @@ -0,0 +1,680 @@ +import * as React from 'react'; + +import MainContainer from '../main-container'; +import './styles.scss'; + +import { styled } from '@mui/material/styles'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardActions from '@mui/material/CardActions'; +import Collapse from '@mui/material/Collapse'; +import IconButton from '@mui/material/IconButton'; +import Typography from '@mui/material/Typography'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import { format } from 'date-fns'; +import { Box, Grid, Modal, Popover, Stack, Tooltip } from '@mui/material'; +import { IconComponent, icons } from '../../componets/icons'; +import { message } from '../../util/handleMessages'; +import { handleExceptionMultipleMessages } from '../../util/handleExceptionAxios'; +import api from '../../services/api'; +import { useToast } from '../../context/ToastContext'; +import { FormInputProps } from '../../componets/form/formInterfaces'; +import { useWindowSize } from '../../util/responsiveness'; +import { useContextGlobal } from '../../context/ContextGlobal'; +import RenderForm from '../../componets/form/renderForm'; +import { FormButton } from '../../componets/form/formButton'; +import { useForm } from 'react-hook-form'; +import { + ExpandMoreProps, + ICardAddTask, + ICardTask, + ITask, + IUpdate, +} from '../../communs/interfaces'; + +const ExpandMore = styled((props: ExpandMoreProps) => { + const { expand, ...other } = props; + return ; +})(({ theme }) => ({ + marginLeft: 'auto', + transition: theme.transitions.create('transform', { + duration: theme.transitions.duration.shortest, + }), + variants: [ + { + props: ({ expand }: ExpandMoreProps) => !expand, + style: { + transform: 'rotate(0deg)', + }, + }, + { + props: ({ expand }: ExpandMoreProps) => !!expand, + style: { + transform: 'rotate(180deg)', + }, + }, + ], +})); + +export const getTextColorDependingOnBackgroundColor = ( + backgroundHexColor: string, +) => { + if (!backgroundHexColor || backgroundHexColor.length !== 7) + return '#ffffff'; + + const redIntensity = parseInt(backgroundHexColor.substring(1, 3), 16); + const greenIntensity = parseInt(backgroundHexColor.substring(3, 5), 16); + const blueIntensity = parseInt(backgroundHexColor.substring(5, 7), 16); + + if ( + redIntensity * 0.299 + greenIntensity * 0.587 + blueIntensity * 0.114 > + 150 + ) { + return '#000000'; + } else { + return '#ffffff'; + } +}; + +let configOptionsColor = [ + { + color: '#BAE2FF', + inverse: '#000000', + }, + { + color: '#B9FFDD', + inverse: '#000000', + }, + { + color: '#FFE8AC', + inverse: '#000000', + }, + { + color: '#FFCAB9', + inverse: '#000000', + }, + { + color: '#F99494', + inverse: '#000000', + }, + { + color: '#9DD6FF', + inverse: '#000000', + }, + { + color: '#ECA1FF', + inverse: '#000000', + }, + { + color: '#DAFF8B', + inverse: '#000000', + }, + { + color: '#FFA285', + inverse: '#000000', + }, + { + color: '#CDCDCD', + inverse: '#000000', + }, + { + color: '#979797', + inverse: '#000000', + }, + { + color: '#A99A7C', + inverse: '#000000', + }, +]; + +interface IModalNote { + open: boolean; + setOpen: (open: boolean) => void; + width: number; + data: ITask | undefined; + index?: number; + id?: string; + settings: any; + setData: (data: ITask | undefined) => void; + updateList: ({ index, data }: { index: number; data: ITask }) => any; +} + +const style = { + position: 'absolute' as 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: '600px', + bgcolor: 'background.paper', + boxShadow: 24, + p: 2, + borderRadius: '4px', +}; + +function ModalNote({ + open, + setOpen, + width, + data, + id, + index, + settings, + updateList, + setData, +}: IModalNote) { + const { addToast } = useToast(); + const { setOpenLoading, setUpdateRows } = useContextGlobal(); + + const defaultValues = { + title: '', + detail: '', + favorite: false, + }; + + const styleModal = { + ...style, + }; + + if (width <= 800) { + styleModal.width = '90%'; + } + + const useFormModal = useForm({ + defaultValues: defaultValues, + }); + const { control, setValue } = useFormModal; + const handleSubmit = useFormModal.handleSubmit; + const reset = useFormModal.reset; + + const inputsForm: FormInputProps[] = React.useMemo( + () => [ + { + typeInput: 'text', + name: 'title', + control: control, + label: 'Título', + loadingAutocomplete: false, + md: 12, + xs: 12, + rules: { + required: true, + }, + messagesError: [ + { + type: 'required', + message: 'O campo título é obrigatório', + }, + ], + autoFocus: true, + }, + { + typeInput: 'text', + name: 'detail', + control: control, + label: 'Detalhes', + loadingAutocomplete: false, + md: 12, + xs: 12, + rules: { + required: true, + }, + messagesError: [ + { + type: 'required', + message: 'O campo detalhe é obrigatório', + }, + ], + multiline: true, + }, + { + typeInput: 'checkbox', + name: 'favorite', + control: control, + label: 'Favorito', + md: 3, + xs: 12, + }, + ], + [control], + ); + + const handleClose = () => { + setOpen(false); + reset(defaultValues); + setData(undefined); + }; + + const submit = async (register: any, e: any) => { + e.preventDefault(); + + if (register['undefined']) { + delete register['undefined']; + } + try { + setOpenLoading(true); + + for (const input of inputsForm) { + if (!input?.dto) { + continue; + } + register = input.dto(register); + } + + let dataToUpdate = { + ...data, + ...register, + }; + + if (id) { + await api.put(`${settings.apiPath}/${id}`, dataToUpdate); + } else { + await api.post(`${settings.apiPath}`, dataToUpdate); + setUpdateRows(true); + } + addToast({ + type: 'success', + title: message.success.save, + description: '', + }); + setOpenLoading(false); + + if (index || index === 0) { + updateList({ data: dataToUpdate, index }); + } + handleClose(); + } catch (error) { + setOpenLoading(false); + const messagesResponse = handleExceptionMultipleMessages(error); + let insideErrors = false; + for (const messageResponse of messagesResponse) { + addToast({ + type: 'error', + title: message.error.save, + description: messageResponse, + }); + insideErrors = true; + } + if (!insideErrors) { + addToast({ + type: 'error', + title: message.error.save, + description: 'Algo deu errado', + }); + } + } + }; + + const setValueData = React.useCallback( + (data: ITask) => { + const keys = Object.keys(data); + for (const input of inputsForm) { + if (input?.setData) { + setValue(input.name, input.setData(data)); + continue; + } + + if (keys.includes(input.name)) { + setValue(input.name, data[input.name as keyof ITask]); + } + } + }, + [inputsForm, setValue], + ); + + React.useEffect(() => { + if (open && data) { + setValueData(data); + } + }, [open, data, setValueData]); + + return ( +
    + + + + {settings.title} + +
    + + + +
    + + + handleClose()} + /> + +
    +
    +
    +
    + ); +} + +const RecipeReviewCard: React.FC = props => { + const { + data: { title, detail, color, favorite, date, id }, + index, + setData, + setOpenModal, + setIndex, + } = props; + + const [expanded, setExpanded] = React.useState(false); + const [loadCard, setLoadCard] = React.useState(false); + const [anchorEl, setAnchorEl] = React.useState(null); + const open = Boolean(anchorEl); + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const { addToast } = useToast(); + const { setUpdateRows } = useContextGlobal(); + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleExpandClick = () => { + if (detail) { + setExpanded(!expanded); + } + }; + + const getConfigIcon = () => { + if (favorite) { + return { + className: 'card-task-icon-favorite', + icon: icons.Star, + }; + } + return { + className: 'card-task-icon-nofavorite', + icon: icons.StarBorder, + }; + }; + + const getConfigIconColorFill = () => { + if (open) { + return { backgroundColor: '#FFE3B3' }; + } + return {}; + }; + + const update = async (updateData: IUpdate) => { + let { data } = updateData; + + try { + setLoadCard(true); + + await api.put(`task/${data.id}`, data); + + setUpdateRows(true); + } catch (error) { + const messagesResponse = handleExceptionMultipleMessages(error); + for (const messageResponse of messagesResponse) { + addToast({ + type: 'error', + title: message.error.save, + description: messageResponse, + }); + } + } + setLoadCard(false); + }; + + const deleteRegister = async (id: string) => { + try { + setLoadCard(true); + + await api.delete(`task/${id}`); + + setUpdateRows(true); + } catch (error) { + const messagesResponse = handleExceptionMultipleMessages(error); + for (const messageResponse of messagesResponse) { + addToast({ + type: 'error', + title: message.error.save, + description: messageResponse, + }); + } + } + setLoadCard(false); + }; + + return ( + +
    +
    + {title} + + {date && + `Criado em: ${format( + new Date(date), + 'dd/MM/yyyy HH:mm', + )}`} + +
    + { + let data = props.data; + data.favorite = !data.favorite; + + update({ data: data }); + }}> + + +
    + + + {title} + + + + + { + setOpenModal(true); + setIndex(index); + setData(props.data); + }}> + + + +
    + + + + + + +
    + {configOptionsColor.map((c, index) => { + return ( +
    { + let data = props.data; + data.color = c.color; + + update({ + data: props.data, + }); + }} + className="card-content-actions-item-color" + style={{ + backgroundColor: c.color, + }}>
    + ); + })} +
    +
    +
    + + + + + id && deleteRegister(id)}> + + + +
    + + + Detalhes: + {detail} + + +
    + ); +}; + +const RecipeReviewCardToAdd: React.FC = props => { + const { setOpenModal, setData } = props; + + return ( + setOpenModal(true)} + sx={{ background: '#FFF' }} + className="card-addtask"> +
    +
    + Título +
    + + + setData({ favorite: true })} + /> + + +
    + + + + Criar nota... + + +
    + ); +}; + +const Component: React.FC = () => { + const { tasks, setTasks } = useContextGlobal(); + const [openModal, setOpenModal] = React.useState(false); + const [data, setData] = React.useState(); + const [index, setIndex] = React.useState(-1); + + const [width] = useWindowSize(); + + const settings = { + apiPath: 'task', + title: 'Nota', + }; + + const updateList = React.useCallback( + ({ index, data }: { index: number; data: ITask }) => { + let list = tasks; + + list[index] = data; + setTasks(list); + }, + [tasks, setTasks], + ); + + return ( +
    +
    + +
    +
    3 + ? `container-body` + : 'container-body container-boby-max-height' + }> + {tasks?.map((d: ITask, index: number) => { + return ( + + ); + })} +
    + +
    + ); +}; + +const Dashboard: React.FC = () => { + return ( + + + + ); +}; + +export default Dashboard; diff --git a/frontend/src/pages/dashboard/styles.scss b/frontend/src/pages/dashboard/styles.scss new file mode 100644 index 0000000..59a9bcf --- /dev/null +++ b/frontend/src/pages/dashboard/styles.scss @@ -0,0 +1,137 @@ +.principal-container-dashboard { + display: flex; + flex-direction: column; + width: 100%; + height: calc(100vh - 64px); + @media (max-width: 600px) { + margin-top: 50px; + } + + .container-body { + display: grid; + grid-template-columns: repeat(3, 1fr); + min-height: calc(100vh - 240px); + gap: 16px; + padding: 12px; + + @media (max-width: 600px) { + grid-template-columns: none + } + + .card-task { + border-radius: 12px; + display: flex; + flex-direction: column; + justify-content: space-between; + overflow: none; + + .card-task-header { + display: flex; + justify-content: space-between; + border-bottom: 1px solid #444; + padding: 12px; + + .card-task-body { + display: flex; + flex-direction: column; + + .card-task-title { + font-size: large; + font-weight: bold; + } + + .card-task-date { + font-size: small; + } + } + + .card-task-icon-favorite { + svg { + cursor: pointer; + color: #ffa000; + } + } + + .card-task-icon-nofavorite { + svg { + cursor: pointer; + } + } + } + + .card-task-content-actions-colorfill { + svg { + color: #ffa000; + } + } + } + } + + .container-boby-max-height { + min-height: auto; + max-height: calc(100vh - 240px); + } + + .container-header { + display: flex; + justify-content: center; + cursor: pointer; + + .card-addtask { + border-radius: 12px; + width: 50%; + + @media (max-width: 600px) { + width: 80%; + } + + .card-addtask-header { + display: flex; + justify-content: space-between; + border-bottom: 1px solid #444; + padding: 12px; + + .card-addtask-body { + display: flex; + flex-direction: column; + + .card-addtask-title { + font-size: large; + font-weight: bold; + } + + } + } + } + } +} + +.card-content-actions-item { + display: grid; + grid-template-columns: repeat(12, 1fr); + justify-content: center; + align-items: center; + gap: 4px; + height: 60px; + width: 530px; + padding: 0 12px; + + @media (max-width: 600px) { + grid-template-columns: repeat(6, 1fr); + height: 120px; + width: 265px; + } + + .card-content-actions-item-color { + border-radius: 50%; + height: 35px; + width: 35px; + cursor: pointer; + } +} + +.box-modal { + .box-modal-title { + margin-bottom: 12px; + } +} diff --git a/frontend/src/pages/main-container/index.tsx b/frontend/src/pages/main-container/index.tsx new file mode 100644 index 0000000..6bc2f04 --- /dev/null +++ b/frontend/src/pages/main-container/index.tsx @@ -0,0 +1,783 @@ +import { ExpandLess, ExpandMore } from '@mui/icons-material'; +import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import CloseIcon from '@mui/icons-material/Close'; +import { Switch, useLocation } from 'react-router-dom'; + +import { FormButton } from '../../componets/form/formButton'; +import MenuIcon from '@mui/icons-material/Menu'; +import MoreVertIcon from '@mui/icons-material/MoreVert'; +import NotificationsIcon from '@mui/icons-material/Notifications'; +import { + Badge, + Collapse, + Drawer, + Grid, + ListItem, + ListItemButton, + ListItemIcon, + ListItemText, + Modal, + Stack, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Button, + Tooltip, + Popover, + InputAdornment, +} from '@mui/material'; +import MuiAppBar, { AppBarProps as MuiAppBarProps } from '@mui/material/AppBar'; +import Box from '@mui/material/Box'; +import CssBaseline from '@mui/material/CssBaseline'; +import Divider from '@mui/material/Divider'; +import IconButton from '@mui/material/IconButton'; +import List from '@mui/material/List'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import { styled, useTheme } from '@mui/material/styles'; +import Toolbar from '@mui/material/Toolbar'; +import Typography from '@mui/material/Typography'; +import * as React from 'react'; +import { Link, useHistory } from 'react-router-dom'; +import AlertDialog from '../../componets/dialog/alertDialog'; +import Footer from '../../componets/footer'; +import { paths, rowsPerPageOptions } from '../../config'; +import { useAuth } from '../../context/AuthContext'; +import { useContextGlobal } from '../../context/ContextGlobal'; +import { floatValue, formatNumber } from '../../util/infoFormat'; +import './styles.scss'; +import { useForm } from 'react-hook-form'; +import { useToast } from '../../context/ToastContext'; +import api from '../../services/api'; +import { + handleExceptionMessage, + handleExceptionMultipleMessages, +} from '../../util/handleExceptionAxios'; +import { message } from '../../util/handleMessages'; +import { FormInputNumber } from '../../componets/form/formInputNumber'; +import { + formatDateWithoutHours, + momentDiff, + momentZoneToDateAddDays, + momentZoneToUnix, +} from '../../util/dateUtil'; +import { IconComponent, icons } from '../../componets/icons'; +import { handleChangePage, objToQuery, queryToObj } from '../../util/query'; +import { cpfAndCnpjMask } from '../../componets/form/mask/cpfAndCnpj'; +import { ColumnDef } from '@tanstack/react-table'; +import { TableGeneric } from '../../componets/table'; +import { + GenericEnum, + stateLegalProcessOptions, +} from '../../communs/enums/generic-enum'; +import { FormInputText } from '../../componets/form/formInputText'; +import imgCoreNotes from '../../assets/images/core-notes.svg'; +import GlobalFilterSearchComponent from '../../componets/filterComponent/filterSearch'; + +const drawerWidth: number = 240; + +interface AppBarProps extends MuiAppBarProps { + open?: boolean; +} + +interface Data { + id: string; + body: any; + view: boolean; + active?: boolean; + company?: { + id: string; + description: string; + }; +} + +interface AwardCustomer { + id: string; + name: string; + awardGiven: number; + total: number; + awardActual: number; +} + +interface IInvoiceDetail { + formPayment: string; + typePayment: string; + description: string; + dueDate: Date; + installmentValue: number; + downloaded: boolean; + workOrder?: { + id: string; + code: string; + customer: { + id: string; + name: string; + identification: string; + }; + }; + outputProduct?: { + id: string; + code: string; + customer: { + id: string; + name: string; + identification: string; + }; + }; +} + +interface HeadCellAward { + disablePadding: boolean; + id: keyof AwardCustomer; + label: string; + numeric: boolean; +} + +interface ModalProps { + open: boolean; + setOpen: (open: boolean) => void; + rows: Data[]; + width: number; + setRows: (data: Data[]) => void; +} + +interface ModalAwardProps { + open: boolean; + setOpen: (open: boolean) => void; + rows: AwardCustomer[]; + setListAwardedCustomers: (list: AwardCustomer[]) => void; + width: number; +} +interface ModalOverdueInstallmentProps { + open: boolean; + setOpen: (open: boolean) => void; + rows: IInvoiceDetail[]; + width: number; +} + +interface ModalBirthdayCustomerProps { + open: boolean; + setOpen: (open: boolean) => void; + rows: Data[]; + width: number; + setRows: (data: Data[]) => void; +} + +interface ModalApplyAwardProps { + open: boolean; + setOpen: (open: boolean) => void; + data?: AwardCustomer; + setListAwardedCustomers: (list: AwardCustomer[]) => void; + width: number; +} + +const headCellsAward: readonly HeadCellAward[] = [ + { + id: 'name', + numeric: false, + disablePadding: false, + label: 'Cliente', + }, + { + id: 'total', + numeric: false, + disablePadding: false, + label: 'Total acumulado', + }, + { + id: 'awardGiven', + numeric: false, + disablePadding: false, + label: 'Acumulado de premiações', + }, + { + id: 'awardActual', + numeric: false, + disablePadding: false, + label: 'Valor atingido', + }, +]; + +type Props = { children: React.ReactNode }; + +interface IChildrenItem { + icon: React.ReactNode; + sx?: any; + to: string; + name: string; + dataQa: string; +} +interface IListItem { + icon: React.ReactNode; + onClick?: () => void; + name: string; + open?: boolean; + dataQa: string; + to?: string; + childrens: IChildrenItem[]; +} +interface IPropsListItem { + items: IListItem[]; +} + +const styleListIcon = { minWidth: 0, pr: 1 }; + +const RenderList = (props: IPropsListItem) => { + const { items } = props; + + return ( + + {items.map((item: IListItem, indexItem: number) => { + if (item.childrens.length > 0) { + return ( + + { + if (item?.onClick) { + item.onClick(); + } + }}> + + {item.icon} + + + {item?.open ? : } + + + {item.childrens.map((children, index) => { + return ( + + + + {children.icon} + + + + + ); + })} + + + ); + } + return ( + { + if (item?.onClick) { + item.onClick(); + } + }} + to={item?.to || ''}> + + {item.icon} + + + + ); + })} + + ); +}; + +const Main = styled('main', { shouldForwardProp: prop => prop !== 'open' })<{ + open?: boolean; +}>(({ theme, open }) => ({ + flexGrow: 1, + padding: theme.spacing(3), + transition: theme.transitions.create('margin', { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + marginLeft: `-${open ? drawerWidth : 0}px`, + ...(open && { + transition: theme.transitions.create('margin', { + easing: theme.transitions.easing.easeOut, + duration: theme.transitions.duration.enteringScreen, + }), + marginLeft: 0, + }), +})); + +const AppBar = styled(MuiAppBar, { + shouldForwardProp: prop => prop !== 'open', +})(({ theme, open }) => ({ + transition: theme.transitions.create(['margin', 'width'], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + ...(open && { + width: `calc(100% - ${open ? drawerWidth : 0}px)`, + marginLeft: `${open ? drawerWidth : 0}px`, + transition: theme.transitions.create(['margin', 'width'], { + easing: theme.transitions.easing.easeOut, + duration: theme.transitions.duration.enteringScreen, + }), + }), +})); + +const DrawerHeader = styled('div')(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + padding: theme.spacing(0, 1), + // necessary for content to be below app bar + ...theme.mixins.toolbar, + justifyContent: 'flex-end', +})); + +const titleMessages = { + nextAudience: 'Próximas audiências', + birthDays: 'Aniversariante(s)', +}; + +const applyDisplayNone = (condition: boolean) => { + if (condition) { + return { display: 'none' }; + } + return {}; +}; + +const MainContainer: React.FC = ({ children }) => { + const history = useHistory(); + const theme = useTheme(); + const { user } = useAuth(); + + const [rowsPerPage, setRowsPerPage] = React.useState(0); + const [page, setPage] = React.useState(0); + + const rowsPerPageDefault = 9; + const QUERY_DEFAULT = `page=0&size=${rowsPerPageDefault}&userId=${user.sub}&sort=favorite,DESC&sort=date,DESC`; + + const { + openCollapseRecords, + handleOpenCollapseRecords, + loadRows, + setUpdateRows, + updateRows, + totalPages, + } = useContextGlobal(); + + const useFormModal = useForm({ + defaultValues: {}, + }); + const { control, getValues } = useFormModal; + const { search, pathname } = useLocation(); + + const closeAll = React.useCallback(() => { + handleOpenCollapseRecords(false); + }, [handleOpenCollapseRecords]); + + const menuItems = React.useMemo( + () => [ + { + icon: , + onClick: () => { + handleOpenCollapseRecords(!openCollapseRecords); + }, + name: 'Cadastros', + open: openCollapseRecords, + dataQa: 'menu-registrations', + childrens: [ + { + icon: , + sx: { + ...applyDisplayNone(false), + }, + to: `/records/user?size=${rowsPerPageOptions[0]}&page=0`, + name: 'Usuários', + dataQa: 'crud-user', + }, + ], + }, + { + icon: , + onClick: () => { + closeAll(); + }, + to: paths.task, + name: 'Anotações', + dataQa: 'crud-note', + childrens: [], + }, + ], + [closeAll, handleOpenCollapseRecords, openCollapseRecords], + ); + + const [open, setOpen] = React.useState(true); + const toggleDrawer = () => { + setOpen(!open); + }; + + const handleDrawerClose = () => { + setOpen(false); + }; + + const handleByOnKeyPressEnterNewQuery = React.useCallback( + (value: any, name: string) => { + const queryObj = queryToObj(search.replace('?', '')); + + const newQuery = { + ...queryObj, + [name]: value, + page: 0, + }; + const nQuery = objToQuery(newQuery); + history.push(`?${nQuery}`); + loadRows(nQuery); + }, + [history, loadRows, search], + ); + + const isDisableLeft = () => { + return page === 0; + }; + + const isDisableRight = () => { + return page + 1 === totalPages; + }; + + function useWindowSize() { + const [size, setSize] = React.useState([0, 0]); + React.useLayoutEffect(() => { + function updateSize() { + setSize([window.innerWidth, window.innerHeight]); + } + window.addEventListener('resize', updateSize); + updateSize(); + return () => window.removeEventListener('resize', updateSize); + }, []); + return size; + } + + const [width] = useWindowSize(); + + React.useEffect(() => { + if (window.screen.width < 800) { + setOpen(false); + } + }, [width]); + + return ( +
    + + + {pathname === '/dashboard' && ( + {}} + toggleSearch={false} + setRowsPerPage={setRowsPerPage} + setPage={setPage} + rowsPerPage={rowsPerPage} + page={page} + implementationLoadRows={loadRows} + updateRows={updateRows} + setUpdateRows={setUpdateRows} + queryDefault={QUERY_DEFAULT} + /> + )} + + +
    +
    + + + + +
    + + history.push( + `/dashboard?page=0&size=9&userId=${user.sub}&sort=favorite,DESC&sort=date,DESC`, + ) + } + src={imgCoreNotes} + alt="CoreNotes" + style={{ cursor: 'pointer' }} + /> + + + CoreNotes + + + {pathname === '/dashboard' && ( + <> +
    + { + if ( + data.charCode === + 13 && + name + ) { + handleByOnKeyPressEnterNewQuery( + data.target + .value, + name, + ); + } + }} + endAdornment={ + + + handleByOnKeyPressEnterNewQuery( + getValues( + 'title', + ), + 'title', + ) + } + /> + + } + /> +
    +
    + { + setPage( + prev => prev - 1, + ); + handleChangePage( + null, + page - 1, + setPage, + history, + loadRows, + ); + }}> + + + { + setPage( + prev => prev + 1, + ); + handleChangePage( + null, + page + 1, + setPage, + history, + loadRows, + ); + }}> + + +
    + + )} +
    +
    + +
    + +
    +
    +
    +
    + + + + {theme.direction === 'ltr' ? ( + + ) : ( + + )} + + + + + + + + + + +
    + theme.palette.mode === 'light' + ? theme.palette.grey[100] + : theme.palette.grey[900], + display: 'flex', + flexDirection: 'column', + p: 0, + }}> + + + {children} + + +
    +
    +
    +
    + ); +}; + +const ITEM_HEIGHT = 48; + +function LongMenu() { + const history = useHistory(); + const { user, signOut } = useAuth(); + + const handlePerfilUser = () => { + handleClose(); + history.push(`${paths.userRegister}/${user.sub}`); + }; + + const options = [ + { + title: 'Meu perfil', + handleClick: handlePerfilUser, + dataQa: 'menuItem-myPerfil', + }, + { + title: 'Sair', + handleClick: signOut, + dataQa: 'menuItem-logOut', + }, + ]; + + const [anchorEl, setAnchorEl] = React.useState(null); + const open = Boolean(anchorEl); + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleFirstName = (name: string) => { + if (name) { + const firstName = name.split(' '); + return firstName[0]; + } + return ''; + }; + + return ( +
    + + + {handleFirstName(user.name)} + + + + + {options.map(option => ( + + {option.title} + + ))} + +
    + ); +} + +export default MainContainer; diff --git a/frontend/src/pages/main-container/styles.scss b/frontend/src/pages/main-container/styles.scss new file mode 100644 index 0000000..3fc6def --- /dev/null +++ b/frontend/src/pages/main-container/styles.scss @@ -0,0 +1,102 @@ +.toolbar { + min-height: 64px !important; + margin: 0 !important; + + .toolbar-content { + display: flex; + justify-content: space-between; + width: 100%; + + .toolbar-content-title { + display: flex; + align-items: center; + gap: 30px; + + @media (max-width: 600px) { + gap: 4px; + } + + .toolbar-content-action { + display: flex; + align-items: center; + gap: 30px; + + @media (max-width: 600px) { + img { + height: 20px; + } + + h1 { + display: none; + } + + button { + padding: 0 4px 4px; + } + } + + .toolbar-content-search { + background-color: #FFF; + border-radius: 8px; + min-width: 400px; + + @media (max-width: 600px) { + min-width: auto; + } + + svg { + cursor: pointer; + } + } + + .toolbar-content-arrows { + display: flex; + + svg { + color: #FFF; + } + } + + @media (max-width: 600px) { + flex-direction: column; + gap: 4px; + padding-top: 4px; + } + } + + .toolbar-content-action-disable { + @media (max-width: 600px) { + display: none; + } + } + + } + + .toolbar-content-logout { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + } + + } +} + +.header-modal { + display: flex; + justify-content: space-between; + align-items: center; +} + +.main-container { + padding:0 !important; + margin: 0 !important; + + .main-box { + padding: 8px 8px 0 8px !important; + } +} + +.MuiAccordionSummary-root:hover{ + background-color: #F5F5F5; +} diff --git a/frontend/src/pages/sign-in/sign-in.tsx b/frontend/src/pages/sign-in/sign-in.tsx new file mode 100644 index 0000000..82f0d59 --- /dev/null +++ b/frontend/src/pages/sign-in/sign-in.tsx @@ -0,0 +1,156 @@ +import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; +import Avatar from '@mui/material/Avatar'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import * as React from 'react'; +import { Controller, useForm } from 'react-hook-form'; +import { FormInputText } from '../../componets/form/formInputText'; +import { useAuth } from '../../context/AuthContext'; +import { useContextGlobal } from '../../context/ContextGlobal'; +import { useToast } from '../../context/ToastContext'; +import { handleExceptionMessage } from '../../util/handleExceptionAxios'; +import { message } from '../../util/handleMessages'; +import image from '../../assets/images/core-notes.svg'; +import './styles.scss'; +import { texts } from '../../config'; + +interface IFormInput { + username: string; + password: string; + test: string; +} + +const SignIn: React.FC = () => { + const { addToast } = useToast(); + const { signIn } = useAuth(); + const { setOpenLoading } = useContextGlobal(); + + const defaultValues = { + username: '', + password: '', + }; + + const rules = { + username: { + required: true, + }, + password: { + required: true, + }, + }; + + const messageError = (errors: any, field: any) => { + // username + if (errors && errors.type === 'required' && field === 'username') { + return 'O campo usuário é obrigátorio.'; + } + // password + if (errors && errors.type === 'required' && field === 'password') { + return 'O campo senha é obrigátorio.'; + } + return ''; + }; + + const { handleSubmit, control, formState } = useForm({ + defaultValues, + }); + + const submit = async (data: IFormInput, e: any) => { + e.preventDefault(); + setOpenLoading(true); + + try { + await signIn({ + username: data.username, + password: data.password, + }); + setOpenLoading(false); + } catch (error) { + setOpenLoading(false); + + const messageResponse = handleExceptionMessage(error); + addToast({ + type: 'error', + title: message.error.login, + description: messageResponse, + }); + } + }; + + return ( +
    +
    + {/* */} +
    + + + + + CORENOTES + +
    +
    + + + + +
    +
    +
    +

    {texts.nameSystem}

    +
    {texts.info}
    + CORENOTES +
    +
    +
    +
    + + {`Copyright © ${texts.nameSystem} `} + {new Date().getFullYear()} + {'.'} + +
    +
    + ); +}; + +export default SignIn; diff --git a/frontend/src/pages/sign-in/styles.scss b/frontend/src/pages/sign-in/styles.scss new file mode 100644 index 0000000..d754bf1 --- /dev/null +++ b/frontend/src/pages/sign-in/styles.scss @@ -0,0 +1,83 @@ +.container { + // background-color: #dcdcdc; + background-image: linear-gradient(to bottom right, #dcdcdc, #1976d2); + + display: flex; + // align-items: center; + justify-content: center; + width: 100%; + height: 100vh; + flex-direction: column; + // padding: 2%; +} + +.main-container { + // border-radius: 16px; + display: flex; + align-items: center; + width: 100%; + +} + +.main { + background-color: #f5f5f5; + // border-radius: 16px; + padding-left: 8px; + padding-right: 8px; + width: 40%; + + @media (max-width: 600px) { + width: 100%; + + } + + height: calc(100vh - 40px); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.main-image { + display: flex; + + @media (max-width: 600px) { + display: none; + } + + justify-content: center; + align-items: center; + flex-direction: column; + background-color: #dcdcdc; + opacity: 0.9; + width: 100%; + border-radius: 8px; + margin-left: 8px; + margin-right: 8px; + .container-title { + // flex: 2; + padding: 8px; + border-radius: 8px; + background-color: #1976d2; + text-align: center; + h2, h6 { + color: #fff; + } + h6 { + line-height: 1.1; + margin: 8px; + } + } + img { + width: 700px; + height: 700px; + } +} + +.footer { + background-color: #dcdcdc; + height: 40px; + display: flex; + align-items: center; + justify-content: center; +} \ No newline at end of file diff --git a/frontend/src/pages/task/index.tsx b/frontend/src/pages/task/index.tsx new file mode 100644 index 0000000..f6dc7fd --- /dev/null +++ b/frontend/src/pages/task/index.tsx @@ -0,0 +1,30 @@ +import { paths } from '../../config'; +import MainContainer from '../main-container'; +import Form from './taskForm'; +import List from './taskList'; + +const settings = { + pathRegister: paths.taskRegister, + pathList: paths.task, + apiPath: 'task', + permissionAdmin: null, + title: 'Anotações', +}; + +const FormEntity: React.FC = () => { + return ( + +
    + + ); +}; + +const ListEntity: React.FC = () => { + return ( + + + + ); +}; + +export { FormEntity, ListEntity }; diff --git a/frontend/src/pages/task/styles.scss b/frontend/src/pages/task/styles.scss new file mode 100644 index 0000000..85923a3 --- /dev/null +++ b/frontend/src/pages/task/styles.scss @@ -0,0 +1,39 @@ +.principal-container-permission { + display: flex; + flex-direction: column; + width: 100%; + margin: 0 !important; + max-width: none !important; + + .header-list { + padding: 16px; + display: flex; + align-items: center; + justify-content: space-between; + + + @media (max-width: 600px){ + padding: 8px; + display: block; + + .header-list-title { + padding-bottom: 8px; + } + } + } + + .header-list-search { + @media (min-width: 600px){ + width: 400px; + } + display: flex; + align-items: flex-end; + justify-content: end; + margin-right: 0; + + } +} + +.container-box { + margin: 0 288px 0 0 !important; +} diff --git a/frontend/src/pages/task/taskForm.tsx b/frontend/src/pages/task/taskForm.tsx new file mode 100644 index 0000000..2bc2c7d --- /dev/null +++ b/frontend/src/pages/task/taskForm.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import { FieldValues } from 'react-hook-form'; +// +import { FormInputProps } from '../../componets/form/formInterfaces'; +import { ImperativeHandleAccessedByParentComponent } from '../../componets/interfaces/formProps'; +import FormComplete from '../../componets/form/formComplete'; + +interface IFormInput extends FieldValues { + description: string; +} + +const defaultValues = {}; + +const Form: React.FC<{ settings: any }> = props => { + const { settings } = props; + + const refForm = + React.useRef>( + null, + ); + + const inputsForm = React.useMemo[]>( + () => [ + { + typeInput: 'text', + name: 'title', + control: null, + label: 'Título', + setValue: null, + md: 12, + xs: 12, + rules: { + required: true, + }, + }, + { + typeInput: 'text', + multiline: true, + name: 'detail', + control: null, + label: 'Detalhes', + loadingAutocomplete: false, + setValue: null, + md: 12, + xs: 12, + rules: { + required: true, + }, + }, + { + typeInput: 'checkbox', + name: 'favorite', + control: null, + label: 'Favorito', + md: 3, + xs: 12, + }, + ], + [], + ); + + return ( + + ); +}; + +export default Form; diff --git a/frontend/src/pages/task/taskList.tsx b/frontend/src/pages/task/taskList.tsx new file mode 100644 index 0000000..7edba51 --- /dev/null +++ b/frontend/src/pages/task/taskList.tsx @@ -0,0 +1,231 @@ +import React from 'react'; +import IconButton from '@mui/material/IconButton'; +import TableCell from '@mui/material/TableCell'; + +import { rowsPerPageOptions } from '../../config'; +import './styles.scss'; +import { ColumnDef } from '@tanstack/react-table'; +import { IconComponent, icons } from '../../componets/icons'; +import { IFormInputPropsFilter } from '../../componets/interfaces/formInputPropsFilter'; +import { IFormSettinsProps } from '../../componets/interfaces/formProps'; +import ListComponet from '../../componets/list'; +import { ImperativeHandleAccessedByParentListComponent } from '../../componets/interfaces/listProps'; +import { + formatDate, + momentZoneToDateAddDays, + momentZoneToUnix, +} from '../../util/dateUtil'; +import * as ImplEnum from '../../communs/enums/generic-enum'; +import { setHours, setMinutes } from 'date-fns'; +import { FormInputProps } from '../../componets/form/formInterfaces'; +import { useAuth } from '../../context/AuthContext'; + +const defaultValues = { + dateInitial: momentZoneToDateAddDays({ days: -90, startOfType: 'day' }), + dateFinal: momentZoneToDateAddDays({ days: 7, endOfType: 'day' }), +}; + +const NoteList: React.FC = props => { + const { settings } = props; + const { user } = useAuth(); + + const refForm = + React.useRef(null); + + const columnsTable = React.useMemo[]>( + () => [ + { + id: 'title', + header: () => ( + + Título + + ), + cell: ({ row }: any) => { + return ( + + refForm?.current?.handleClick(row.original.id) + }> + {row.original?.title} + + ); + }, + }, + + { + id: 'user', + header: () => ( + + Usuário + + ), + cell: ({ row }: any) => { + return ( + + refForm?.current?.handleClick(row.original.id) + }> + {row.original?.user?.name} + + ); + }, + }, + { + accessorKey: 'date', + header: () => ( + + Data de cadastro + + ), + cell: (cell: any) => ( + + refForm?.current?.handleClick(cell.row.original.id) + }> + {cell?.row.original.date + ? formatDate(cell?.row.original?.date) + : ''} + + ), + }, + { + accessorKey: 'date', + header: () => ( + + Favorito + + ), + cell: (cell: any) => ( + + refForm?.current?.handleClick(cell.row.original.id) + }> + {cell?.row.original.favorite ? 'Sim' : 'Não'} + + ), + }, + { + id: 'select', + header: ({ table }: any) => , + cell: ({ row }: any) => ( + + + refForm.current?.handleEdit(row.original.id) + }> + + + { + refForm.current?.setIdDelete(row.original.id); + refForm.current?.setOpenModalDelete(true); + }}> + + + + ), + }, + ], + [], + ); + + const QUERY_DEFAULT = `page=0&size=${ + rowsPerPageOptions[0] + }&dateInitial=${momentZoneToUnix( + defaultValues.dateInitial, + )}&dateFinal=${momentZoneToUnix(defaultValues.dateFinal)}&userId=${ + user.sub + }&sort=date,DESC`; + + const inputsFilter = React.useMemo( + () => [ + { + typeInput: 'text', + name: 'title', + control: null, + label: 'Título', + setValue: null, + size: 'small', + variant: 'standard', + handleOnKeyPress: (data: any, name?: string) => { + if (data.charCode === 13 && name) { + refForm?.current?.handleByOnKeyPressEnterNewQuery( + data.target.value, + name, + ); + } + }, + }, + ], + [], + ); + + const mainInputsFilter = React.useMemo( + () => [ + { + typeInput: 'dateHour', + name: 'dateInitial', + control: null, + label: 'Date de início', + loadingAutocomplete: false, + md: 6, + xs: 12, + handleChange: (data: any) => { + let newTime = setHours(data, 0); + newTime = setMinutes(newTime, 1); + refForm?.current?.handleByOnKeyPressEnterNewQuery( + momentZoneToUnix(newTime), + 'dateInitial', + ); + }, + setValue: null, + fullWidth: true, + clearErrors: null, + setError: null, + }, + { + typeInput: 'dateHour', + name: 'dateFinal', + control: null, + label: 'Date de fim', + loadingAutocomplete: false, + md: 6, + xs: 12, + handleChange: (data: any) => { + let newTime = setHours(data, 23); + newTime = setMinutes(newTime, 59); + refForm?.current?.handleByOnKeyPressEnterNewQuery( + momentZoneToUnix(newTime), + 'dateFinal', + ); + }, + setValue: null, + fullWidth: true, + clearErrors: null, + setError: null, + }, + ], + [], + ); + + return ( + + ); +}; + +export default NoteList; diff --git a/frontend/src/pages/user/styles.scss b/frontend/src/pages/user/styles.scss new file mode 100644 index 0000000..52bdeea --- /dev/null +++ b/frontend/src/pages/user/styles.scss @@ -0,0 +1,11 @@ +.principal-container { + display: flex; + flex-direction: column; + width: 100%; + margin: 0 !important; + max-width: none !important; +} + +.container-box { + margin: 0 288px 0 0 !important; +} diff --git a/frontend/src/pages/user/user.tsx b/frontend/src/pages/user/user.tsx new file mode 100644 index 0000000..19812a7 --- /dev/null +++ b/frontend/src/pages/user/user.tsx @@ -0,0 +1,30 @@ +import { paths } from '../../config'; +import MainContainer from '../main-container'; +import Form from './userForm'; +import List from './userList'; + +const settings = { + pathRegister: paths.userRegister, + pathList: paths.user, + apiPath: 'user', + permissionAdmin: null, + title: 'Usuários', +}; + +const User: React.FC = () => { + return ( + + + + ); +}; + +const UserList: React.FC = () => { + return ( + + + + ); +}; + +export { User, UserList }; diff --git a/frontend/src/pages/user/userForm.tsx b/frontend/src/pages/user/userForm.tsx new file mode 100644 index 0000000..d664a4a --- /dev/null +++ b/frontend/src/pages/user/userForm.tsx @@ -0,0 +1,162 @@ +import React, { useCallback } from 'react'; +import { FieldValues } from 'react-hook-form'; +// +import { FormInputProps } from '../../componets/form/formInterfaces'; +import { ImperativeHandleAccessedByParentComponent } from '../../componets/interfaces/formProps'; +import FormComplete from '../../componets/form/formComplete'; +import * as ImplEnum from '../../communs/enums/generic-enum'; +import { useAuth } from '../../context/AuthContext'; +import { useHistory } from 'react-router-dom'; + +const enumInstances = { + permissionOptionsInstance: new ImplEnum.GenericEnum( + ImplEnum.permissionOptions, + ), +}; +const permissionOptions = enumInstances.permissionOptionsInstance.optionsList(); + +interface IFormInput extends FieldValues { + description: string; +} + +const defaultValues = { + authorities: [], +}; + +const Form: React.FC<{ settings: any }> = props => { + const { settings } = props; + + const history = useHistory(); + + const { user, signOut } = useAuth(); + + const refForm = + React.useRef>( + null, + ); + + const inputsForm = React.useMemo[]>( + () => [ + { + typeInput: 'text', + name: 'name', + control: null, + label: 'Nome', + setValue: null, + md: 6, + xs: 12, + rules: { + required: true, + }, + autoFocus: true, + }, + { + typeInput: 'text', + name: 'nameToEnter', + control: null, + label: 'Usuário', + loadingAutocomplete: false, + setValue: null, + md: 6, + xs: 12, + rules: { + required: true, + }, + dto: data => { + data.username = data.nameToEnter; + return data; + }, + setData: data => { + return data.username; + }, + }, + { + typeInput: 'password', + name: 'password', + control: null, + label: 'Senha', + md: 5, + xs: 12, + rules: { + pattern: /^(?=.*[a-zA-Z])(?=.*\d)[A-Za-z\d@$!%*?&]{6,15}$/, + }, + messagesError: [ + { + type: 'pattern', + message: + 'A senha tem que ter de 6 a 15 caracteres, ao menos uma letra e ao menos um número', + }, + ], + }, + { + typeInput: 'password', + name: 'passwordConfirmation', + control: null, + label: 'Confirmar senha', + md: 4, + xs: 12, + rules: { + validate: (val: string) => { + if ( + val && + refForm?.current?.watch('password') !== val + ) { + return 'As senhas não conferem'; + } + }, + }, + }, + { + typeInput: 'autocomplete', + name: 'authorities', + control: null, + label: 'Permissões', + loadingAutocomplete: false, + setValue: null, + options: permissionOptions, + md: 11, + xs: 11, + multiple: true, + rules: { + required: true, + }, + dto: data => { + data.authorities = data.authorities + .map((a: any) => a.id) + .join(','); + return data; + }, + setData: data => { + return data.authorities + .split(',') + .map((a: any) => + enumInstances.permissionOptionsInstance.getObject( + a, + ), + ); + }, + }, + ], + [], + ); + + const callbackSuccess = async (data: any) => { + if (data?.id == user.sub) { + signOut(); + } else { + history.push(`${settings.pathList}?`); + } + }; + + return ( + + ); +}; + +export default Form; diff --git a/frontend/src/pages/user/userList.tsx b/frontend/src/pages/user/userList.tsx new file mode 100644 index 0000000..a0402c3 --- /dev/null +++ b/frontend/src/pages/user/userList.tsx @@ -0,0 +1,245 @@ +import { Delete, ModeEdit } from '@mui/icons-material'; +import FilterListIcon from '@mui/icons-material/FilterList'; +import { Chip, Stack } from '@mui/material'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import Paper from '@mui/material/Paper'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableContainer from '@mui/material/TableContainer'; +import TableHead from '@mui/material/TableHead'; +import TablePagination from '@mui/material/TablePagination'; +import TableRow from '@mui/material/TableRow'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; +import React, { MouseEvent, useEffect, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { useHistory, useLocation, useParams } from 'react-router-dom'; + +import { defaultLabelDisplayedRows } from '../../communs/tablePaginationAssistant'; +import AlertDialog from '../../componets/dialog/alertDialog'; +import FilterSearch from '../../componets/filterComponent/filterSearch'; +import { FormButton } from '../../componets/form/formButton'; +import { FormInputText } from '../../componets/form/formInputText'; +import { paths, rowsPerPageOptions } from '../../config'; +import { useContextGlobal } from '../../context/ContextGlobal'; +import { useToast } from '../../context/ToastContext'; +import api from '../../services/api'; +import { handleExceptionMessage } from '../../util/handleExceptionAxios'; +import { message } from '../../util/handleMessages'; +import { + handleChangePage, + handleChangeRowsPerPage, + objToQuery, + queryToObj, +} from '../../util/query'; +import './styles.scss'; +import { IFormInputPropsFilter } from '../../componets/interfaces/formInputPropsFilter'; +import ListComponet from '../../componets/list'; +import { useAuth } from '../../context/AuthContext'; +import { ImperativeHandleAccessedByParentListComponent } from '../../componets/interfaces/listProps'; +import { ColumnDef } from '@tanstack/react-table'; +import { IFormSettinsProps } from '../../componets/interfaces/formProps'; +import { IconComponent, icons } from '../../componets/icons'; +import { FormInputProps } from '../../componets/form/formInterfaces'; +import * as ImplEnum from '../../communs/enums/generic-enum'; + +interface Data { + id: string; + name: string; + email?: string; + active?: boolean; +} + +interface HeadCell { + disablePadding: boolean; + id: keyof Data; + label: string; + numeric: boolean; +} + +const headCells: readonly HeadCell[] = [ + { + id: 'name', + numeric: false, + disablePadding: false, + label: 'Nome', + }, + { + id: 'email', + numeric: false, + disablePadding: false, + label: 'E-mail', + }, + { + id: 'active', + numeric: false, + disablePadding: false, + label: 'Ativo', + }, +]; + +const defaultValues = { + user: { + nameDefault: '', + name: '', + }, +}; + +const enumInstances = { + permissionOptionsInstance: new ImplEnum.GenericEnum( + ImplEnum.permissionOptions, + ), +}; + +const UserList: React.FC = props => { + const { settings } = props; + + const refForm = + React.useRef(null); + + const columnsTable = React.useMemo[]>( + () => [ + { + accessorKey: 'name', + header: () => ( + + Nome + + ), + cell: (cell: any) => ( + + refForm?.current?.handleClick(cell.row.original.id) + }> + {cell?.row.original.name} + + ), + }, + { + id: 'authories', + header: () => ( + + Permissões + + ), + cell: ({ row }: any) => { + return ( + + refForm?.current?.handleClick(row.original.id) + }> + + {row.original?.authorities + ?.split(',') + .map((authorize: string) => ( + + ))} + + + ); + }, + }, + { + id: 'select', + header: ({ table }: any) => , + cell: ({ row }: any) => ( + + + refForm.current?.handleEdit(row.original.id) + }> + + + { + refForm.current?.setIdDelete(row.original.id); + refForm.current?.setOpenModalDelete(true); + }}> + + + + ), + }, + ], + [], + ); + + const QUERY_DEFAULT = `page=0&size=${rowsPerPageOptions[0]}`; + + const inputsFilter = React.useMemo( + () => [ + { + typeInput: 'text', + name: 'username', + control: null, + label: 'Usuário', + setValue: null, + size: 'small', + variant: 'standard', + handleOnKeyPress: (data: any, name?: string) => { + if (data.charCode === 13 && name) { + refForm?.current?.handleByOnKeyPressEnterNewQuery( + data.target.value, + name, + ); + } + }, + }, + ], + [], + ); + + const mainInputsFilter = React.useMemo( + () => [ + { + typeInput: 'text', + name: 'name', + control: null, + label: 'Nome', + loadingAutocomplete: false, + md: 12, + xs: 12, + handleChange: (data: any) => { + refForm?.current?.handleByOnKeyPressEnterNewQuery( + data, + 'name', + ); + }, + setValue: null, + fullWidth: true, + clearErrors: null, + setError: null, + variant: 'standard', + }, + ], + [], + ); + + return ( + + ); +}; + +export default UserList; diff --git a/frontend/src/react-app-env.d.ts b/frontend/src/react-app-env.d.ts new file mode 100644 index 0000000..6431bc5 --- /dev/null +++ b/frontend/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontend/src/reportWebVitals.ts b/frontend/src/reportWebVitals.ts new file mode 100644 index 0000000..49a2a16 --- /dev/null +++ b/frontend/src/reportWebVitals.ts @@ -0,0 +1,15 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + 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/frontend/src/routes.tsx b/frontend/src/routes.tsx new file mode 100644 index 0000000..6836a46 --- /dev/null +++ b/frontend/src/routes.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Switch } from 'react-router-dom'; +import { paths } from './config'; +import Dashboard from './pages/dashboard'; +import { User, UserList } from './pages/user/user'; +import Route from './Route'; +import { FormEntity as TaskForm, ListEntity as TaskList } from './pages/task'; +import SignIn from './pages/sign-in/sign-in'; + +const Routes: React.FC = () => ( + + + + + {/*INICIO - cadastros gerais */} + + + {/*FIM - cadastros gerais */} + + + + {/* */} + +); + +export default Routes; diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts new file mode 100755 index 0000000..8e920e9 --- /dev/null +++ b/frontend/src/services/api.ts @@ -0,0 +1,33 @@ +import axios from 'axios'; +import { urls } from '../config'; + +const baseURL = + process.env.REACT_APP_ENVIROMENT === 'local' + ? urls.api.local + : urls.api.prod; + +const api = axios.create({ + baseURL, +}); + +api.interceptors.response.use( + response => { + return response; + }, + error => { + console.log('response ', error.response); + if ( + error.response.status === 403 && + error.response?.data?.message === 'Access Denied' + ) { + localStorage.removeItem('@CORELAB:token'); + setTimeout(() => window.location.reload(), 500); + return { + data: { data: [], token: null }, + }; + } + return Promise.reject(error); + }, +); + +export default api; diff --git a/frontend/src/services/download-report.ts b/frontend/src/services/download-report.ts new file mode 100644 index 0000000..4be6f8a --- /dev/null +++ b/frontend/src/services/download-report.ts @@ -0,0 +1,47 @@ +import moment from 'moment'; +import api from './api'; + +export interface IDataReport { + nameReport: string; + params: any; + setLoading?: (loading: boolean) => void; +} + +function base64ToArrayBuffer(base64: any) { + var binaryString = atob(base64); + var bytes = new Uint8Array(binaryString.length); + for (var i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes.buffer; +} + +export const downloadReport = async ({ + nameReport, + params, + setLoading, +}: IDataReport) => { + try { + const response = await api.get(`reports?nameReport=${nameReport}`, { + responseType: 'arraybuffer', + params, + }); + + let typeArchive = 'pdf'; + if (params.type) { + typeArchive = params.type; + } + const blob = new Blob([response.data], { + type: `application/${typeArchive}`, + }); + const link = document.createElement('a'); + link.href = window.URL.createObjectURL(blob); + link.download = `${nameReport}_${moment().format( + 'YYYYMMDDHmmss', + )}.${typeArchive}`; + link.click(); + } catch (error) { + setLoading && setLoading(false); + throw new Error(String(error)); + } +}; diff --git a/frontend/src/setupTests.ts b/frontend/src/setupTests.ts new file mode 100644 index 0000000..8f2609b --- /dev/null +++ b/frontend/src/setupTests.ts @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/frontend/src/util/colors.ts b/frontend/src/util/colors.ts new file mode 100644 index 0000000..e6e1658 --- /dev/null +++ b/frontend/src/util/colors.ts @@ -0,0 +1,6 @@ +export const colors = { + success: '#4caf50', + error: '#e65100', + info: '#3172b7', + warn: '#ff9800', +}; diff --git a/frontend/src/util/dateUtil.ts b/frontend/src/util/dateUtil.ts new file mode 100644 index 0000000..851495f --- /dev/null +++ b/frontend/src/util/dateUtil.ts @@ -0,0 +1,99 @@ +import moment, { unitOfTime } from 'moment-timezone'; + +interface ImomentZoneToDateAddDays { + days: number; + date?: Date; + endOfType?: string; + startOfType?: string; +} + +export function formatDate(date: undefined | Date): string { + if (date) { + return momentDate(date).format('DD/MM/YYYY HH:mm'); + } + return momentDate(undefined).format('DD/MM/YYYY HH:mm'); +} + +export function formatUnixDate(number: number): string { + if (number) { + return moment.unix(number).format('DD/MM/YYYY'); + } + return ''; +} + +export function unixToDate(number: number): Date { + if (number) { + return moment.unix(number).tz('America/Sao_Paulo').toDate(); + } + return moment().tz('America/Sao_Paulo').toDate(); +} + +export function formatDateWithoutHours(date: undefined | Date): string { + if (date) { + return momentDate(date).format('DD/MM/YYYY'); + } + return momentDate(undefined).format('DD/MM/YYYY'); +} + +export function momentDate(date: undefined | Date) { + if (date) { + return moment(date).tz('America/Sao_Paulo'); + } + return moment().tz('America/Sao_Paulo'); +} + +export function momentDiff( + dateEnd: Date, + type: unitOfTime.Diff, + dateStart?: Date, +) { + if (dateStart) { + return moment(dateStart).startOf('day').diff(moment(dateEnd), type); + } + return moment(dateEnd).diff(moment().startOf('day'), type); +} + +export function momentZone() { + return moment().tz('America/Sao_Paulo').toDate(); +} + +export function momentZoneToDateAddDays({ + days, + date, + endOfType, + startOfType, +}: ImomentZoneToDateAddDays) { + let momentTemp = null; + if (date) { + momentTemp = moment(date).tz('America/Sao_Paulo').add(days, 'days'); + } else { + momentTemp = moment().tz('America/Sao_Paulo').add(days, 'days'); + } + + if (endOfType && endOfType == 'day') { + momentTemp = momentTemp.endOf('day'); + } + + if (startOfType && startOfType == 'day') { + momentTemp = momentTemp.startOf('day'); + } + return momentTemp.toDate(); +} + +export function momentZoneToDate(date: undefined | Date) { + if (date) { + return moment(date).tz('America/Sao_Paulo').toDate(); + } + return moment().tz('America/Sao_Paulo').toDate(); +} + +export function momentZoneToUnix(date: undefined | Date | null) { + if (date) { + return moment(date).tz('America/Sao_Paulo').unix(); + } + return moment().tz('America/Sao_Paulo').unix(); +} + +export function isValidDate(date: Date) { + return moment(date).isValid(); +} diff --git a/frontend/src/util/findValueObjectByKey.ts b/frontend/src/util/findValueObjectByKey.ts new file mode 100644 index 0000000..0794932 --- /dev/null +++ b/frontend/src/util/findValueObjectByKey.ts @@ -0,0 +1,20 @@ +export const findVal = (object: any, key: any) => { + var value; + Object.keys(object).some(function (k) { + if (k === key) { + value = object[k]; + return true; + } + if (object[k] && typeof object[k] === 'object') { + value = findVal(object[k], key); + return value !== undefined; + } + }); + return value; +}; + +export const resolveValueObject = (path: string, obj: any) => { + return path.split('.').reduce(function (prev, curr) { + return prev ? prev[curr] : null; + }, obj); +}; diff --git a/frontend/src/util/handleExceptionAxios.ts b/frontend/src/util/handleExceptionAxios.ts new file mode 100644 index 0000000..a982b34 --- /dev/null +++ b/frontend/src/util/handleExceptionAxios.ts @@ -0,0 +1,36 @@ +export const handleExceptionMessage = (error: any): string => { + if ( + typeof error?.request?.response == 'string' && + error?.request?.response.includes('{') + ) { + const response = JSON.parse(error.request.response); + if (response.message) { + return response.message; + } + } + return ''; +}; +export const handleExceptionMultipleMessages = (error: any): string[] => { + if (typeof error?.request?.response == 'string') { + const response = JSON.parse(error.request.response); + if (response?.message && typeof response.message == 'string') { + return [response.message]; + } + if (response?.message && typeof response.message != 'string') { + return response.message; + } + } + return []; +}; +export const handleExceptionMessageApiNfe = (error: any): string[] => { + if (typeof error?.request?.response == 'string') { + const response = JSON.parse(error.request.response); + if (typeof response.message == 'string') { + return [response.message]; + } + if (typeof response.message != 'string') { + return response.message; + } + } + return []; +}; diff --git a/frontend/src/util/handleMessages.ts b/frontend/src/util/handleMessages.ts new file mode 100644 index 0000000..6d8a7e6 --- /dev/null +++ b/frontend/src/util/handleMessages.ts @@ -0,0 +1,40 @@ +export const message = { + error: { + delete: 'Error deleting record', + deleteAllOrOne: 'Error deleting record(s)', + selectAll: 'Error selecting record', + selectOne: 'Error selecting record', + save: 'Error saving record', + login: 'Error logging in', + downloadPdf: 'Error downloading file', + }, + success: { + delete: 'Record successfully deleted', + deleteAllOrOne: 'Record(s) deleted successfully', + selectAll: '', + selectOne: '', + save: 'Record saved successfully', + }, + warn: { + save: 'A regra para salvar o registro não foi atendida', + }, +}; + +export function handleMessageError( + messageError?: (errors: any, field: any) => string, + messagesError?: any[], + errors?: any, + name?: any, +) { + if (messageError && errors) { + return messageError(errors, name); + } + + if (messagesError && errors) { + return messagesError.find(m => m.type == errors.type)?.message; + } + + if (errors && errors.type === 'validate') { + return errors.message; + } +} diff --git a/frontend/src/util/infoFormat.ts b/frontend/src/util/infoFormat.ts new file mode 100644 index 0000000..92d510c --- /dev/null +++ b/frontend/src/util/infoFormat.ts @@ -0,0 +1,28 @@ +export const formatNumber = (number: string | number | any) => { + if (!number) { + return '0,00'; + } + number = Number(number).toFixed(2); + const newNumber = Number(number).toLocaleString('pt-BR', { + style: 'decimal', + currency: 'BRL', + minimumFractionDigits: 2, + }); + + return newNumber; +}; + +export const floatValue = (number: string | any) => { + if ((number && typeof number) === 'string') { + number = Number(number.replace('.', '').replace(',', '.')); + } + return number; +}; + +export const roundNumber = (number: string | number) => { + return Number(Number(number).toFixed(2)); +}; + +export interface IObjectKeys { + [key: string]: string | number | any; +} diff --git a/frontend/src/util/interfaces/description.ts b/frontend/src/util/interfaces/description.ts new file mode 100644 index 0000000..c336f5c --- /dev/null +++ b/frontend/src/util/interfaces/description.ts @@ -0,0 +1,4 @@ +export default interface IDescription { + id: string; + description: string; +} diff --git a/frontend/src/util/interfaces/name.ts b/frontend/src/util/interfaces/name.ts new file mode 100644 index 0000000..013c61f --- /dev/null +++ b/frontend/src/util/interfaces/name.ts @@ -0,0 +1,4 @@ +export default interface IName { + id: string; + name: string; +} diff --git a/frontend/src/util/query.ts b/frontend/src/util/query.ts new file mode 100644 index 0000000..9279f69 --- /dev/null +++ b/frontend/src/util/query.ts @@ -0,0 +1,101 @@ +import { IFormInputPropsFilter } from '../componets/interfaces/formInputPropsFilter'; +import { rowsPerPageOptions } from '../config'; +import { settingSetValue } from './settingSetValue'; + +export function queryToObj(query: string) { + return query + ? JSON.parse( + '{"' + query.replace(/&/g, '","').replace(/=/g, '":"') + '"}', + function (key, value) { + return key === '' ? value : decodeURIComponent(value); + }, + ) + : {}; +} + +export function objToQuery(obj: any, arrNotInclude?: string[]) { + return Object.keys(obj) + .reduce(function (a: string[], k) { + if (arrNotInclude && arrNotInclude.includes(k)) { + return a; + } + if (obj[k]) { + const query: string = `${k}=${encodeURIComponent(obj[k])}`; + a.push(query); + } + return a; + }, []) + .join('&'); +} + +export const handleChangePage = ( + event: unknown, + newPage: number, + setPage: (number: number) => void, + history: any, + loadRows?: (query: string) => Promise, +) => { + const objQuery = queryToObj(window.location.search.replace('?', '')); + objQuery.page = newPage.toString(); + const query = objToQuery(objQuery); + history.push(`?${query}`); + + setPage(newPage); + + if (loadRows) { + loadRows(query); + } +}; + +export const handleChangeRowsPerPage = ( + event: React.ChangeEvent, + setRowsPerPage: (number: number) => void, + setPage: (number: number) => void, + history: any, + loadRows?: (query: string) => Promise, +) => { + const rowsPerPage = parseInt(event.target.value, 10); + const objQuery = queryToObj(window.location.search.replace('?', '')); + objQuery.size = rowsPerPage; + objQuery.page = 1; + const query = objToQuery(objQuery); + history.push(`?${query}`); + setRowsPerPage(rowsPerPage); + setPage(0); + + if (loadRows) { + loadRows(query); + } +}; + +export async function setValuesOfQuery( + queryDefault: string, + inputs: IFormInputPropsFilter[], + setRowsPerPage: (number: number) => void, + setPage: (number: number) => void, +) { + const objOfQuery = queryToObj(queryDefault); + const keys = Object.keys(objOfQuery); + + inputs.forEach(i => { + i.setValue(i.name, ''); + }); + + for (const k of keys) { + const input = inputs.find(i => i.name === k || i?.aliasToQuery === k); + + if (input) { + settingSetValue[input.typeInput](objOfQuery[k], input); + } + + if (k === 'page') { + setPage(Number(objOfQuery[k])); + } + + if (k === 'size') { + setRowsPerPage(Number(objOfQuery[k])); + } + } +} + +export const LINES_PER_PAGE = 5; diff --git a/frontend/src/util/randomIdInput.ts b/frontend/src/util/randomIdInput.ts new file mode 100644 index 0000000..8c09e50 --- /dev/null +++ b/frontend/src/util/randomIdInput.ts @@ -0,0 +1,3 @@ +export function randomId(name: string): string { + return `${name}-${Math.random() * 1000000000000}`; +} diff --git a/frontend/src/util/responsiveness.ts b/frontend/src/util/responsiveness.ts new file mode 100755 index 0000000..2c78172 --- /dev/null +++ b/frontend/src/util/responsiveness.ts @@ -0,0 +1,14 @@ +import React from 'react'; + +export function useWindowSize() { + const [size, setSize] = React.useState([0, 0]); + React.useLayoutEffect(() => { + function updateSize() { + setSize([window.innerWidth, window.innerHeight]); + } + window.addEventListener('resize', updateSize); + updateSize(); + return () => window.removeEventListener('resize', updateSize); + }, []); + return size; +} diff --git a/frontend/src/util/settingSetValue.ts b/frontend/src/util/settingSetValue.ts new file mode 100644 index 0000000..69edfb2 --- /dev/null +++ b/frontend/src/util/settingSetValue.ts @@ -0,0 +1,30 @@ +import { IFormInputPropsFilter } from '../componets/interfaces/formInputPropsFilter'; +import api from '../services/api'; +import { unixToDate } from './dateUtil'; + +export const settingSetValue = { + text: async (value: string, input: IFormInputPropsFilter) => { + input.setValue && input.setValue(input.name, value); + }, + date: async (value: string, input: IFormInputPropsFilter) => { + const newDate = unixToDate(Number(value)); + input.setValue(input.name, newDate); + }, + autocomplete: async (value: string, input: IFormInputPropsFilter) => { + if (input?.options) { + if (input.options.length === 0 && input?.entityPath) { + const { data } = await api.get(`${input.entityPath}/${value}`); + input.options.push(data); + } + const option = input.options.find(o => o.id === value); + input.setValue(input.name, option); + } + }, + multiple: async (value: string, input: IFormInputPropsFilter) => { + const values = value.split(',').map(v => ({ id: v })); + + if (input.options || input?.query) { + input.setValue(input.name, values); + } + }, +}; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..2ef1f67 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["es6", "dom"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true + }, + "include": [ + "src" + ] +} diff --git a/frontend/yarn.lock b/frontend/yarn.lock new file mode 100644 index 0000000..2ef1707 --- /dev/null +++ b/frontend/yarn.lock @@ -0,0 +1,11696 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adobe/css-tools@^4.0.1": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" + integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@amcharts/amcharts5@^5.2.26": + version "5.3.16" + resolved "https://registry.yarnpkg.com/@amcharts/amcharts5/-/amcharts5-5.3.16.tgz#552d5250dbc45d4f0c272c19df3f091054ef1bb5" + integrity sha512-mtYsLmJ/7DrAF61y/m79MNshFC9x9BnoRjlHAk1WBjyWPXtpKthO/FrsdJGPezl44pflnusKgsJEqOQXVOA2Qw== + dependencies: + "@types/d3" "^7.0.0" + "@types/d3-chord" "^3.0.0" + "@types/d3-hierarchy" "3.1.1" + "@types/d3-sankey" "^0.11.1" + "@types/d3-shape" "^3.0.0" + "@types/geojson" "^7946.0.8" + "@types/polylabel" "^1.0.5" + "@types/svg-arc-to-cubic-bezier" "^3.2.0" + d3 "^7.0.0" + d3-chord "^3.0.0" + d3-geo "^3.0.0" + d3-sankey "^0.12.3" + d3-selection "^3.0.0" + d3-transition "^3.0.0" + flatpickr "^4.6.9" + markerjs2 "^2.29.4" + pdfmake "^0.2.2" + polylabel "^1.1.0" + regression "^2.0.1" + svg-arc-to-cubic-bezier "^3.2.0" + tslib "^2.2.0" + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" + integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== + +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" + integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/eslint-parser@^7.16.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.5.tgz#fa032503b9e2d188e25b1b95d29e8b8431042d78" + integrity sha512-C69RWYNYtrgIRE5CmTd77ZiLDXqgBipahJc/jHP3sLcAGj6AJzxNIuKNpVnICqbyK7X3pFUfEvL++rvtbQpZkQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.22.5", "@babel/generator@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" + integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz#2192a1970ece4685fbff85b48da2c32fcb130b7c" + integrity sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + semver "^6.3.0" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz#bb2bf0debfe39b831986a4efbf4066586819c6e4" + integrity sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.0" + +"@babel/helper-define-polyfill-provider@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" + integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2" + integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-replace-supers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" + integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06" + integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" + integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.7.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-decorators@^7.16.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.5.tgz#dc8cdda048e5aea947efda920e030199806b868d" + integrity sha512-h8hlezQ4dl6ixodgXkH8lUfcD7x+WAuIqPUjwGoItynrXOAv4a4Tci1zA/qjzQjjcl0v3QpLdc2LM6ZACQuY7A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/plugin-syntax-decorators" "^7.22.5" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz#329fe2907c73de184033775637dbbc507f09116a" + integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" + integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz#7336356d23380eda9a56314974f053a020dab0c3" + integrity sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz#635d4e98da741fad814984639f4c0149eb0135e1" + integrity sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@^7.16.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" + integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.22.5" + +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz#1003762b9c14295501beb41be72426736bedd1e0" + integrity sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ== + 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" + +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz#6dfa7c1c37f7d7279e417ceddf5a04abb8bb9c29" + integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.16.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz#ca975fb5e260044473c8142e1b18b567d33c2a3b" + integrity sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz#5c0f7adfc1b5f38c4dbc8f79b1f0f8074134bd7d" + integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.5.tgz#3da66078b181f3d62512c51cf7014392c511504e" + integrity sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@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.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@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.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.5" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.5" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + core-js-compat "^3.30.2" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" + integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + +"@babel/preset-typescript@^7.16.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz#16367d8b01d640e9a507577ed4ee54e0101e51c8" + integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-typescript" "^7.22.5" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" + integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.5", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@csstools/normalize.css@*": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" + integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== + +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== + +"@date-io/core@^2.15.0", "@date-io/core@^2.16.0": + version "2.16.0" + resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.16.0.tgz#7871bfc1d9bca9aa35ad444a239505589d0f22f6" + integrity sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg== + +"@date-io/date-fns@^2.13.1", "@date-io/date-fns@^2.15.0": + version "2.16.0" + resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.16.0.tgz#bd5e09b6ecb47ee55e593fc3a87e7b2caaa3da40" + integrity sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/dayjs@^2.15.0": + version "2.16.0" + resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-2.16.0.tgz#0d2c254ad8db1306fdc4b8eda197cb53c9af89dc" + integrity sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/luxon@^2.15.0": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@date-io/luxon/-/luxon-2.16.1.tgz#b08786614cb58831c729a15807753011e4acb966" + integrity sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ== + dependencies: + "@date-io/core" "^2.16.0" + +"@date-io/moment@^2.15.0": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-2.16.1.tgz#ec6e0daa486871e0e6412036c6f806842a0eeed4" + integrity sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ== + dependencies: + "@date-io/core" "^2.16.0" + +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + 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" + +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + 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" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^1.1.0", "@emotion/is-prop-valid@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.9.0": + version "11.11.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@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" + +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== + 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" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@^11.8.1": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" + 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" + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.2" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.43.0": + version "8.43.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" + integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== + +"@foliojs-fork/fontkit@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz#8124649168eb5273f580f66697a139fb5041296b" + integrity sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A== + dependencies: + "@foliojs-fork/restructure" "^2.0.2" + brfs "^2.0.0" + brotli "^1.2.0" + browserify-optional "^1.0.1" + clone "^1.0.4" + deep-equal "^1.0.0" + dfa "^1.2.0" + tiny-inflate "^1.0.2" + unicode-properties "^1.2.2" + unicode-trie "^2.0.0" + +"@foliojs-fork/linebreak@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@foliojs-fork/linebreak/-/linebreak-1.1.1.tgz#93ecd695b7d2bb0334b9481058c3e610e019a4eb" + integrity sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig== + dependencies: + base64-js "1.3.1" + brfs "^2.0.2" + unicode-trie "^2.0.0" + +"@foliojs-fork/pdfkit@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@foliojs-fork/pdfkit/-/pdfkit-0.13.0.tgz#54f5368d8cf74d8edc81a175ccda1fd9655f2db9" + integrity sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ== + dependencies: + "@foliojs-fork/fontkit" "^1.9.1" + "@foliojs-fork/linebreak" "^1.1.1" + crypto-js "^4.0.0" + png-js "^1.0.0" + +"@foliojs-fork/restructure@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@foliojs-fork/restructure/-/restructure-2.0.2.tgz#73759aba2aff1da87b7c4554e6839c70d43c92b4" + integrity sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA== + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + 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" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.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" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mui/base@5.0.0-beta.5": + version "5.0.0-beta.5" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.5.tgz#b566f3beb1eb2823139eabaf52014cf7be900015" + integrity sha512-vy3TWLQYdGNecTaufR4wDNQFV2WEg6wRPi6BVbx6q1vP3K1mbxIn1+XOqOzfYBXjFHvMx0gZAo2TgWbaqfgvAA== + dependencies: + "@babel/runtime" "^7.22.5" + "@emotion/is-prop-valid" "^1.2.1" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.13.6" + "@popperjs/core" "^2.11.8" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/core-downloads-tracker@^5.13.4": + version "5.13.4" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz#7e4b491d8081b6d45ae51556d82cb16b31315a19" + integrity sha512-yFrMWcrlI0TqRN5jpb6Ma9iI7sGTHpytdzzL33oskFHNQ8UgrtPas33Y1K7sWAMwCrr1qbWDrOHLAQG4tAzuSw== + +"@mui/icons-material@^5.6.2": + version "5.11.16" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.16.tgz#417fa773c56672e39d6ccfed9ac55591985f0d38" + integrity sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A== + dependencies: + "@babel/runtime" "^7.21.0" + +"@mui/material@^5.6.2": + version "5.13.6" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.13.6.tgz#caaba1e071e394c415208404ce6964e6c14c16d6" + integrity sha512-/c2ZApeQm2sTYdQXjqEnldaBMBcUEiyu2VRS6bS39ZeNaAcCLBQbYocLR46R+f0S5dgpBzB0T4AsOABPOFYZ5Q== + dependencies: + "@babel/runtime" "^7.22.5" + "@mui/base" "5.0.0-beta.5" + "@mui/core-downloads-tracker" "^5.13.4" + "@mui/system" "^5.13.6" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.13.6" + "@types/react-transition-group" "^4.4.6" + clsx "^1.2.1" + csstype "^3.1.2" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" + +"@mui/private-theming@^5.13.1": + version "5.13.1" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.13.1.tgz#c3e9a0b44f9c5a51b92cfcfb660536060cb61ed7" + integrity sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ== + dependencies: + "@babel/runtime" "^7.21.0" + "@mui/utils" "^5.13.1" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.13.2": + version "5.13.2" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.13.2.tgz#c87bd61c0ab8086d34828b6defe97c02bcd642ef" + integrity sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw== + dependencies: + "@babel/runtime" "^7.21.0" + "@emotion/cache" "^11.11.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/styles@^5.6.2": + version "5.13.2" + resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.13.2.tgz#0d6c1b7c5437293cf4f0d98d1fd8c5cc02bb4138" + integrity sha512-gKNkVyk6azQ8wfCamh3yU/wLv1JscYrsQX9huQBwfwtE7kUTq2rgggdfJjRADjbcmT6IPX+oCHYjGfqqFgDIQQ== + dependencies: + "@babel/runtime" "^7.21.0" + "@emotion/hash" "^0.9.1" + "@mui/private-theming" "^5.13.1" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.13.1" + clsx "^1.2.1" + csstype "^3.1.2" + 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" + +"@mui/system@^5.13.6": + version "5.13.6" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.13.6.tgz#5bf4f84fad0c9ed771458f821e384f61abfa33ca" + integrity sha512-G3Xr28uLqU3DyF6r2LQkHGw/ku4P0AHzlKVe7FGXOPl7X1u+hoe2xxj8Vdiq/69II/mh9OP21i38yBWgWb7WgQ== + dependencies: + "@babel/runtime" "^7.22.5" + "@mui/private-theming" "^5.13.1" + "@mui/styled-engine" "^5.13.2" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.13.6" + clsx "^1.2.1" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/types@^7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" + integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== + +"@mui/utils@^5.10.3", "@mui/utils@^5.13.1", "@mui/utils@^5.13.6": + version "5.13.6" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.13.6.tgz#aa29d75de59577585b9f23891b03592d40459ed7" + integrity sha512-ggNlxl5NPSbp+kNcQLmSig6WVB0Id+4gOxhx644987v4fsji+CSXc+MFYLocFB/x4oHtzCUlSzbVHlJfP/fXoQ== + dependencies: + "@babel/runtime" "^7.22.5" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^18.2.0" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/x-data-grid@^5.9.0": + version "5.17.26" + resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-5.17.26.tgz#1f7fa73dd3986cf052e2fd2cb56eb4678a7bd913" + integrity sha512-eGJq9J0g9cDGLFfMmugOadZx0mJeOd/yQpHwEa5gUXyONS6qF0OhXSWyDOhDdA3l2TOoQzotMN5dY/T4Wl1KYA== + dependencies: + "@babel/runtime" "^7.18.9" + "@mui/utils" "^5.10.3" + clsx "^1.2.1" + prop-types "^15.8.1" + reselect "^4.1.6" + +"@mui/x-date-pickers@^5.0.0-alpha.2": + version "5.0.20" + resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz#7b4e5b5a214a8095937ba7d82bb82acd6f270d72" + integrity sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA== + dependencies: + "@babel/runtime" "^7.18.9" + "@date-io/core" "^2.15.0" + "@date-io/date-fns" "^2.15.0" + "@date-io/dayjs" "^2.15.0" + "@date-io/luxon" "^2.15.0" + "@date-io/moment" "^2.15.0" + "@mui/utils" "^5.10.3" + "@types/react-transition-group" "^4.4.5" + clsx "^1.2.1" + prop-types "^15.7.2" + react-transition-group "^4.4.5" + rifm "^0.12.1" + +"@nestjs/mapped-types@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz#c8a090a8d22145b85ed977414c158534210f2e4f" + integrity sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg== + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.10" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz#2eba163b8e7dbabb4ce3609ab5e32ab63dda3ef8" + integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.23.3" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.4" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rushstack/eslint-patch@^1.1.0": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz#31b9c510d8cada9683549e1dbb4284cca5001faf" + integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw== + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + 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" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + 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" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + 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" + +"@tanstack/react-table@^8.7.9": + version "8.9.3" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.9.3.tgz#03a52e9e15f65c82a8c697a445c42bfca0c5cfc4" + integrity sha512-Ng9rdm3JPoSCi6cVZvANsYnF+UoGVRxflMb270tVj0+LjeT/ZtZ9ckxF6oLPLcKesza6VKBqtdF9mQ+vaz24Aw== + dependencies: + "@tanstack/table-core" "8.9.3" + +"@tanstack/table-core@8.9.3": + version "8.9.3" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.9.3.tgz#991da6b015f6200fdc841c48048bee5e197f6a46" + integrity sha512-NpHZBoHTfqyJk0m/s/+CSuAiwtebhYK90mDuf5eylTvgViNOujiaOaxNDxJkQQAsVvHWZftUGAx1EfO1rkKtLg== + +"@testing-library/dom@^8.5.0": + version "8.20.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^5.16.4": + version "5.16.5" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" + integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^13.1.1": + version "13.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@testing-library/user-event@^13.5.0": + version "13.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" + integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== + dependencies: + "@babel/runtime" "^7.12.5" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + +"@types/axios@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@types/axios/-/axios-0.14.0.tgz#ec2300fbe7d7dddd7eb9d3abf87999964cafce46" + integrity sha512-KqQnQbdYE54D7oa/UmYVMZKq7CO4l8DEENzOKc4aBRwxCXSlJXGz83flFx5L7AWrOQnmuN3kVsRdt+GZPPjiVQ== + dependencies: + axios "*" + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" + integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/d3-array@*", "@types/d3-array@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.5.tgz#857c1afffd3f51319bbc5b301956aca68acaa7b8" + integrity sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A== + +"@types/d3-axis@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.2.tgz#96e11d51256baf5bdb2fa73a17d302993e79df07" + integrity sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-brush@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.2.tgz#a610aad5a1e76c375be63e11c5eee1ed9fd2fb40" + integrity sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-chord@*", "@types/d3-chord@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.2.tgz#cf6f05ad2d8faaad524e9e6f454b4fd06b200930" + integrity sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw== + +"@types/d3-color@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.0.tgz#6594da178ded6c7c3842f3cc0ac84b156f12f2d4" + integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== + +"@types/d3-contour@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.2.tgz#d8a0e4d12ec14f7d2bb6e59f3fbc1a527457d0b2" + integrity sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ== + dependencies: + "@types/d3-array" "*" + "@types/geojson" "*" + +"@types/d3-delaunay@*": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz#006b7bd838baec1511270cb900bf4fc377bbbf41" + integrity sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ== + +"@types/d3-dispatch@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz#b2fa80bab3bcead68680766e966f59cd6cb9a69f" + integrity sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg== + +"@types/d3-drag@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.2.tgz#5562da3e7b33d782c2c1f9e65c5e91bb01ee82cf" + integrity sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-dsv@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.1.tgz#c51a3505cee42653454b74a00f8713dc3548c362" + integrity sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw== + +"@types/d3-ease@*", "@types/d3-ease@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.0.tgz#c29926f8b596f9dadaeca062a32a45365681eae0" + integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== + +"@types/d3-fetch@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.2.tgz#fe1f335243e07c9bd520c9a71756fed8330c54b1" + integrity sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.4.tgz#2d50bd2b695f709797e1745644f6bc123e6e5f5a" + integrity sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw== + +"@types/d3-format@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.1.tgz#194f1317a499edd7e58766f96735bdc0216bb89d" + integrity sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg== + +"@types/d3-geo@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.0.3.tgz#535e5f24be13722964c52354301be09b752f5d6e" + integrity sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@*": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b3a446b5437faededb30ac32b7cc0486559ab1e2" + integrity sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A== + +"@types/d3-hierarchy@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz#cd4656f5d17a98e26ed5d6f4be96dbda454af8b3" + integrity sha512-QwjxA3+YCKH3N1Rs3uSiSy1bdxlLB1uUiENXeJudBoAFvtDuswUxLcanoOaR2JYn1melDTuIXR8VhnVyI3yG/A== + +"@types/d3-interpolate@*", "@types/d3-interpolate@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz#e7d17fa4a5830ad56fe22ce3b4fac8541a9572dc" + integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.0.tgz#939e3a784ae4f80b1fde8098b91af1776ff1312b" + integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== + +"@types/d3-path@^1": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" + integrity sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ== + +"@types/d3-polygon@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.0.tgz#5200a3fa793d7736fa104285fa19b0dbc2424b93" + integrity sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw== + +"@types/d3-quadtree@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz#433112a178eb7df123aab2ce11c67f51cafe8ff5" + integrity sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw== + +"@types/d3-random@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.1.tgz#5c8d42b36cd4c80b92e5626a252f994ca6bfc953" + integrity sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ== + +"@types/d3-sankey@^0.11.1": + version "0.11.2" + resolved "https://registry.yarnpkg.com/@types/d3-sankey/-/d3-sankey-0.11.2.tgz#803214b11dc0a17db5d782fe9055cd92b06a5d75" + integrity sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ== + dependencies: + "@types/d3-shape" "^1" + +"@types/d3-scale-chromatic@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#103124777e8cdec85b20b51fd3397c682ee1e954" + integrity sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw== + +"@types/d3-scale@*", "@types/d3-scale@^4.0.2": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.3.tgz#7a5780e934e52b6f63ad9c24b105e33dd58102b5" + integrity sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-selection@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.5.tgz#27cd53b7672d405025e2414d98532d7934c16ebd" + integrity sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w== + +"@types/d3-shape@*", "@types/d3-shape@^3.0.0", "@types/d3-shape@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.1.tgz#15cc497751dac31192d7aef4e67a8d2c62354b95" + integrity sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A== + dependencies: + "@types/d3-path" "*" + +"@types/d3-shape@^1": + version "1.3.8" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.8.tgz#c3c15ec7436b4ce24e38de517586850f1fea8e89" + integrity sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg== + dependencies: + "@types/d3-path" "^1" + +"@types/d3-time-format@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.0.tgz#ee7b6e798f8deb2d9640675f8811d0253aaa1946" + integrity sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw== + +"@types/d3-time@*", "@types/d3-time@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" + integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== + +"@types/d3-timer@*", "@types/d3-timer@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.0.tgz#e2505f1c21ec08bda8915238e397fb71d2fc54ce" + integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== + +"@types/d3-transition@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.3.tgz#d4ac37d08703fb039c87f92851a598ba77400402" + integrity sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-zoom@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.3.tgz#5c29006a61ff7ca512fe21398c66ad95dd846674" + integrity sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/d3@^7.0.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.0.tgz#fc5cac5b1756fc592a3cf1f3dc881bf08225f515" + integrity sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA== + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" + "@types/d3-fetch" "*" + "@types/d3-force" "*" + "@types/d3-format" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" + "@types/d3-polygon" "*" + "@types/d3-quadtree" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" + "@types/d3-selection" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" + "@types/d3-time-format" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": + version "8.40.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.2.tgz#2833bc112d809677864a4b0e7d1de4f04d7dac2d" + integrity sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/geojson@*", "@types/geojson@^7946.0.8": + version "7946.0.10" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" + integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== + +"@types/graceful-fs@^4.1.2": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/hoist-non-react-statics@*": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/http-proxy@^1.17.8": + version "1.17.11" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" + integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*": + version "29.5.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" + integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/jest@^27.4.1": + version "27.5.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" + integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/jsonwebtoken@^8.5.8": + version "8.5.9" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz#2c064ecb0b3128d837d2764aa0b117b0ff6e4586" + integrity sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.175": + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/moment-timezone@^0.5.30": + version "0.5.30" + resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.5.30.tgz#340ed45fe3e715f4a011f5cfceb7cb52aad46fc7" + integrity sha512-aDVfCsjYnAQaV/E9Qc24C5Njx1CoDjXsEgkxtp9NyXDpYu4CCbmclb6QhWloS9UTU/8YROUEEdEkWI0D7DxnKg== + dependencies: + moment-timezone "*" + +"@types/moment@^2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@types/moment/-/moment-2.13.0.tgz#604ebd189bc3bc34a1548689404e61a2a4aac896" + integrity sha512-DyuyYGpV6r+4Z1bUznLi/Y7HpGn4iQ4IVcGn8zrr1P4KotKLdH0sbK1TFR6RGyX6B+G8u83wCzL+bpawKU/hdQ== + dependencies: + moment "*" + +"@types/node@*": + version "20.3.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" + integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== + +"@types/node@^16.11.27": + version "16.18.36" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.36.tgz#0db5d7efc4760d36d0d1d22c85d1a53accd5dc27" + integrity sha512-8egDX8dE50XyXWH6C6PRCNkTP106DuUrvdrednFouDSmCi7IOvrqr0frznfZaHifHH/3aq/7a7v9N4wdXMqhBQ== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/polylabel@^1.0.5": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/polylabel/-/polylabel-1.1.0.tgz#64de94a02f839817bd9203f4241e7fe685bd6b7c" + integrity sha512-rVJvU3E60xtNClDb9+ZnyqayNL/IcwlFnHSQEMI3Unh8MVugo24WrwcAcfs3RzUopl27MqQX6hrqKxqA1+ylew== + +"@types/prettier@^2.1.5": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/prop-types@*", "@types/prop-types@^15.7.5": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.2": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.6.tgz#ad621fa71a8db29af7c31b41b2ea3d8a6f4144d1" + integrity sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A== + dependencies: + "@types/react" "*" + +"@types/react-event-listener@^0.4.12": + version "0.4.12" + resolved "https://registry.yarnpkg.com/@types/react-event-listener/-/react-event-listener-0.4.12.tgz#601b6b83e53fbea191cadf32175e4d9af6004e64" + integrity sha512-ilfwCBSnIfd55qhMTIYvEjoMVds8xXDgwoBd1CT1MjiZBmE8oEstjrHos5iI/pUmAGooalo9oEUBc79kXVuYlA== + dependencies: + "@types/react" "*" + +"@types/react-is@^18.2.0": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-18.2.1.tgz#61d01c2a6fc089a53520c0b66996d458fdc46863" + integrity sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw== + dependencies: + "@types/react" "*" + +"@types/react-router-dom@^5.2.0": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react-table@^7.7.14": + version "7.7.14" + resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.14.tgz#b880f1ae140ed065bca2e21b3008ca1ebe71595a" + integrity sha512-TYrv7onCiakaG1uAu/UpQ9FojNEt/4/ht87EgJQaEGFoWV606ZLWUZAcUHzMxgc3v1mywP1cDyz3qB4ho3hWOw== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.5", "@types/react-transition-group@^4.4.6": + version "4.4.6" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.6": + version "18.2.14" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.14.tgz#fa7a6fecf1ce35ca94e74874f70c56ce88f7a127" + integrity sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/socket.io-client@^1.4.36": + version "1.4.36" + resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.36.tgz#e4f1ca065f84c20939e9850e70222202bd76ff3f" + integrity sha512-ZJWjtFBeBy1kRSYpVbeGYTElf6BqPQUkXDlHHD4k/42byCN5Rh027f4yARHCink9sKAkbtGZXEAmR0ZCnc2/Ag== + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/styled-components@^5.1.2": + version "5.1.26" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.26.tgz#5627e6812ee96d755028a98dae61d28e57c233af" + integrity sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw== + dependencies: + "@types/hoist-non-react-statics" "*" + "@types/react" "*" + csstype "^3.0.2" + +"@types/svg-arc-to-cubic-bezier@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#4dec441693436b03f821d4a8d5b5c74f1e3fcca4" + integrity sha512-3h04sJhF2rjOq8zUhyomORyKdr0RUts7FAz/JajBKGpTF0JSXjaj9fjWtAqj+pU1fwsGsHzcm3Neew3t/McUXA== + +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.6" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz#4887f6e1af11215428ab02777873bcede98a53b0" + integrity sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA== + dependencies: + "@types/jest" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.5.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz#2f4bea6a3718bed2ba52905358d0f45cd3620d31" + integrity sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.60.0" + "@typescript-eslint/type-utils" "5.60.0" + "@typescript-eslint/utils" "5.60.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.60.0.tgz#48ffa47238592397c3d857fe1403eed3b1d5e604" + integrity sha512-ovid3u7CNBrr0Ct35LUPkNYH4e+z4Kc6dPfSG99oMmH9SfoEoefq09uSnJI4mUb/UM7a/peVM03G+MzLxrD16g== + dependencies: + "@typescript-eslint/utils" "5.60.0" + +"@typescript-eslint/parser@^5.5.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.0.tgz#08f4daf5fc6548784513524f4f2f359cebb4068a" + integrity sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ== + dependencies: + "@typescript-eslint/scope-manager" "5.60.0" + "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/typescript-estree" "5.60.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz#ae511967b4bd84f1d5e179bb2c82857334941c1c" + integrity sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ== + dependencies: + "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/visitor-keys" "5.60.0" + +"@typescript-eslint/type-utils@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz#69b09087eb12d7513d5b07747e7d47f5533aa228" + integrity sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g== + dependencies: + "@typescript-eslint/typescript-estree" "5.60.0" + "@typescript-eslint/utils" "5.60.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.0.tgz#3179962b28b4790de70e2344465ec97582ce2558" + integrity sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA== + +"@typescript-eslint/typescript-estree@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz#4ddf1a81d32a850de66642d9b3ad1e3254fb1600" + integrity sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ== + dependencies: + "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/visitor-keys" "5.60.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.60.0", "@typescript-eslint/utils@^5.58.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.0.tgz#4667c5aece82f9d4f24a667602f0f300864b554c" + integrity sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.60.0" + "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/typescript-estree" "5.60.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.60.0": + version "5.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz#b48b29da3f5f31dd1656281727004589d2722a66" + integrity sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw== + dependencies: + "@typescript-eslint/types" "5.60.0" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-node@^1.3.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0, acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0, acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2: + version "8.9.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" + integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + 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" + +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + 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" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +aria-query@^5.0.0, aria-query@^5.1.3: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg== + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +ast-transform@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/ast-transform/-/ast-transform-0.0.0.tgz#74944058887d8283e189d954600947bc98fe0062" + integrity sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A== + dependencies: + escodegen "~1.2.0" + esprima "~1.0.4" + through "~2.3.4" + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +ast-types@^0.7.0: + version "0.7.8" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.7.8.tgz#902d2e0d60d071bdcd46dc115e1809ed11c138a9" + integrity sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.13: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== + +axios@*: + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axios@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== + dependencies: + follow-redirects "^1.14.8" + +axobject-query@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + 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" + +babel-jest@^27.4.2, babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.2.3: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + 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" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-named-asset-import@^0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" + integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== + +babel-plugin-polyfill-corejs2@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" + integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.4.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" + integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.0" + core-js-compat "^3.30.1" + +babel-plugin-polyfill-regenerator@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" + integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.0" + +"babel-plugin-styled-components@>= 1.12.0": + version "2.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz#9a1f37c7f32ef927b4b008b529feb4a2c82b1092" + 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" + +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + 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" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" + 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" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg== + +base64-js@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base64-js@^1.1.2, base64-js@^1.3.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bfj@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + 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" + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brfs@^2.0.0, brfs@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brfs/-/brfs-2.0.2.tgz#44237878fa82aa479ce4f5fe2c1796ec69f07845" + integrity sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ== + dependencies: + quote-stream "^1.0.1" + resolve "^1.1.5" + static-module "^3.0.2" + through2 "^2.0.0" + +brotli@^1.2.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" + integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== + dependencies: + base64-js "^1.1.2" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-resolve@^1.8.1: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-optional@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-optional/-/browserify-optional-1.0.1.tgz#1e13722cfde0d85f121676c2a72ced533a018869" + integrity sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ== + dependencies: + ast-transform "0.0.0" + ast-types "^0.7.0" + browser-resolve "^1.8.1" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0, camelcase@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + 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" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: + version "1.0.30001507" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz#fae53f6286e7564783eadea9b447819410a59534" + integrity sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A== + +case-sensitive-paths-webpack-plugin@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + 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" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +char-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + +check-types@^11.1.1: + version "11.2.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" + integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +classnames@^2.2.5: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +clean-css@^5.2.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + dependencies: + source-map "~0.6.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw== + +component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + 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" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-js-compat@^3.30.1, core-js-compat@^3.30.2: + version "3.31.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.0.tgz#4030847c0766cc0e803dcdfb30055d7ef2064bf1" + integrity sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw== + dependencies: + browserslist "^4.21.5" + +core-js-pure@^3.23.3: + version "3.31.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.31.0.tgz#052fd9e82fbaaf86457f5db1fadcd06f15966ff2" + integrity sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg== + +core-js@^3.19.2: + version "3.31.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.31.0.tgz#4471dd33e366c79d8c0977ed2d940821719db344" + integrity sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + 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" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-js@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-declaration-sorter@^6.3.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" + integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^6.5.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-minimizer-webpack-plugin@^3.2.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + 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" + +css-to-react-native@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-unit-converter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssdb@^7.1.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.6.0.tgz#beac8f7a5f676db62d3c33da517ef4c9eb008f8b" + integrity sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.6: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.0.2, csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.2, csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +"d3-array@1 - 2": + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.1.6, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3, d3-chord@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3, d3-ease@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@3, d3-geo@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" + integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3, d3-interpolate@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-sankey@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" + integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== + dependencies: + d3-array "1 - 2" + d3-shape "^1.2.0" + +d3-scale-chromatic@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" + integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4, d3-scale@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@3, d3-shape@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3, d3-time@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3, d3-timer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3, d3-transition@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.0.0: + version "7.8.5" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.8.5.tgz#fde4b760d4486cdb6f0cc8e2cbff318af844635c" + integrity sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +dash-ast@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-2.0.1.tgz#8d0fd2e601c59bf874cc22877ee7dd889f54dee8" + integrity sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-fns@^2.28.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +dayjs@^1.11.8: + version "1.11.8" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.8.tgz#4282f139c8c19dd6d0c7bd571e30c2d0ba7698ea" + integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decimal.js-light@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + +decimal.js@^10.2.1: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-equal@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-equal@^2.0.5: + version "2.2.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" + integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.0" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delaunator@5: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" + integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== + dependencies: + robust-predicates "^3.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +dfa@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.2.0.tgz#96ac3204e2d29c49ea5b57af8d92c2ae12790657" + integrity sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.6.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" + integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== + dependencies: + readable-stream "^2.0.2" + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.6: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.431: + version "1.4.440" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz#d3b1eeb36b717eb479a240c0406ac1fa67901762" + integrity sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-client@~3.5.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.3.tgz#3254f61fdbd53503dc9a6f9d46a52528871ca0d7" + integrity sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~7.4.2" + xmlhttprequest-ssl "~1.6.2" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.4" + blob "0.0.5" + has-binary2 "~1.0.2" + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-module-lexer@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A== + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@^0.1.5, es6-set@~0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.6.tgz#5669e3b2aa01d61a50ba79964f733673574983b8" + integrity sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + es6-iterator "~2.0.3" + es6-symbol "^3.1.3" + event-emitter "^0.3.5" + type "^2.7.2" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^1.11.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.2.0.tgz#09de7967791cc958b7f89a2ddb6d23451af327e1" + integrity sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA== + dependencies: + esprima "~1.0.4" + estraverse "~1.5.0" + esutils "~1.0.0" + optionalDependencies: + source-map "~0.1.30" + +eslint-config-prettier@^8.3.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.25.3: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-prettier@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0: + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-plugin-testing-library@^5.0.1: + version "5.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz#0bad7668e216e20dd12f8c3652ca353009163121" + integrity sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q== + dependencies: + "@typescript-eslint/utils" "^5.58.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint-webpack-plugin@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" + integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== + dependencies: + "@types/eslint" "^7.29.0 || ^8.4.1" + jest-worker "^28.0.2" + micromatch "^4.0.5" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + +eslint@^8.3.0, eslint@^8.9.0: + version "8.43.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.43.0.tgz#3e8c6066a57097adfd9d390b8fc93075f257a094" + integrity sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.43.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esprima@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + integrity sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" + integrity sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ== + +estree-is-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/estree-is-function/-/estree-is-function-1.0.0.tgz#c0adc29806d7f18a74db7df0f3b2666702e37ad2" + integrity sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +esutils@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" + integrity sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-emitter@^0.3.5, event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@^4.0.0, eventemitter3@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + 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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +expect@^29.0.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + 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" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-equals@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== + +fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + 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" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatpickr@^4.6.9: + version "4.6.13" + resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.13.tgz#8a029548187fd6e0d670908471e43abe9ad18d94" + integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw== + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.0.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + 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" + +fs-monkey@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-assigned-identifiers@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + 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" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + 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" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + 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" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + 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" + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-webpack-plugin@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" + integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + 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" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== + dependencies: + harmony-reflect "^1.4.6" + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +imask@^6.6.3: + version "6.6.3" + resolved "https://registry.yarnpkg.com/imask/-/imask-6.6.3.tgz#f9619cea770b97b5ef616acb036d27cf4a1b33d8" + integrity sha512-a9MTDhm+ET4G2IRcdUGuVTXHS05WsRNPGM5CeNJnXiXuoi4zv7g0/UDFLlRF4lBBeb8EWds4C4JVwhI0nuAIug== + +immer@^9.0.7: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +immutable@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +install@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/install/-/install-0.13.0.tgz#6af6e9da9dd0987de2ab420f78e60d9c17260776" + integrity sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA== + +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-arguments@^1.0.4, is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + 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" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + 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" + +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@^27.4.2, jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-watcher@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^28.0.2: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.4.3: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +jiti@^1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" + integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + 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" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +jss-plugin-camel-case@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c" + integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.10.0" + +jss-plugin-default-unit@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293" + integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-global@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd" + integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-nested@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219" + integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7" + integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-rule-value-function@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b" + integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7" + integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.10.0" + +jss@10.10.0, jss@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc" + 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" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4, klona@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0, loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +magic-string@0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e" + integrity sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg== + dependencies: + sourcemap-codec "^1.4.1" + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +markerjs2@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/markerjs2/-/markerjs2-2.29.4.tgz#0b80b0750f9522c38a6257baf822433cad0511d2" + integrity sha512-Fvtay7a8lGjy8T+ns3fQdeHF8LnAnjg3TO5HUsgVJ2/xUUaIOCfeKbutvivcyrYyG4tnTaiPUMg+mhsZ+Fa9bQ== + +material-ui-numeric-input@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/material-ui-numeric-input/-/material-ui-numeric-input-3.2.0.tgz#bbb5e331d19fd864f035532b8aa9cac9e3c4cbde" + integrity sha512-y9C2AdupPI5bXsSFDDrh+S20D/loiyG89NmhOUfZHPScfGznLbh6P1MfcZJonFgjtphdVUlipWNA2HH/IQGF8Q== + dependencies: + babel-eslint "^10.1.0" + eslint "^8.9.0" + eslint-config-prettier "^8.3.0" + eslint-plugin-prettier "^4.0.0" + eslint-plugin-react "^7.28.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.3.tgz#d9b40fe4f8d5788c5f895bda804cd0d9eeee9f3b" + integrity sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw== + dependencies: + fs-monkey "^1.0.4" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-source-map@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" + integrity sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA== + dependencies: + source-map "^0.5.6" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.4.5: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +moment-timezone@*, moment-timezone@^0.5.37: + version "0.5.43" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.43.tgz#3dd7f3d0c67f78c23cd1906b9b2137a09b3c4790" + integrity sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ== + dependencies: + moment "^2.29.4" + +moment@*, moment@^2.29.3, moment@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoclone@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" + integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nwsapi@^2.2.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" + integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.3, object-inspect@^1.6.0, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.0.1, object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.0, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + 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" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + 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" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@^0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + 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" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pdfmake@^0.2.2: + version "0.2.7" + resolved "https://registry.yarnpkg.com/pdfmake/-/pdfmake-0.2.7.tgz#a7a46532ffde032674929988393c20b075cf65e3" + integrity sha512-ClLpgx30H5G3EDvRW1MrA1Xih6YxEaSgIVFrOyBMgAAt62V+hxsyWAi6JNP7u1Fc5JKYAbpb4RRVw8Rhvmz5cQ== + dependencies: + "@foliojs-fork/linebreak" "^1.1.1" + "@foliojs-fork/pdfkit" "^0.13.0" + iconv-lite "^0.6.3" + xmldoc "^1.1.2" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +png-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/png-js/-/png-js-1.0.0.tgz#e5484f1e8156996e383aceebb3789fd75df1874d" + integrity sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g== + +polylabel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/polylabel/-/polylabel-1.1.0.tgz#9483e64fc7a12a49f43e07e7a06752214ed2a8e7" + integrity sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA== + dependencies: + tinyqueue "^2.0.3" + +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-browser-comments@^4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.10: + version "12.1.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== + dependencies: + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" + +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.0.1: + version "7.8.3" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^7.0.35: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" + integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== + +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-expr@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" + integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quote-stream@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" + integrity sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ== + dependencies: + buffer-equal "0.0.1" + minimist "^1.1.3" + through2 "^2.0.0" + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + 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" + +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== + dependencies: + core-js "^3.19.2" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-hook-form@7.25.3: + version "7.25.3" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.25.3.tgz#1475fd52398e905e1f6d88835f96aaa1144635c3" + integrity sha512-jL4SByMaC8U3Vhu9s7CwgJBP4M6I3Kpwxib9LrCwWSRPnXDrNQL4uihSTqLLoDICqSUhwwvian9uVYfv+ITtGg== + +react-icons@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-3.11.0.tgz#2ca2903dfab8268ca18ebd8cc2e879921ec3b254" + integrity sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q== + dependencies: + camelcase "^5.0.0" + +react-imask@^6.4.2: + version "6.6.3" + resolved "https://registry.yarnpkg.com/react-imask/-/react-imask-6.6.3.tgz#febb3fb62e098d5cb51537e591bb2b6f7a7676ff" + integrity sha512-ZjqKXqBtc1LlFQWEj/SNuk4rQWXDdzLnDqCfNMnqdHHMqSvD1J+JuQZTuWgCCr5cLJxaXshDHW5AmhClk367Gw== + dependencies: + imask "^6.6.3" + prop-types "^15.8.1" + +react-is@^16.10.2, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0, react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-number-format@^4.9.3: + version "4.9.4" + resolved "https://registry.yarnpkg.com/react-number-format/-/react-number-format-4.9.4.tgz#013ae526000e676e491763ce14da66fb330a9bd8" + integrity sha512-Gq20Z3ugqPLFgeaidnx5on9cNpbQZntPN3QgNAL/WJrNNlQnNznY0LCx7g8xtssmRBw0/hw+SCqw6zAcajooiA== + dependencies: + prop-types "^15.7.2" + +react-refresh@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== + +react-resize-detector@^8.0.4: + version "8.1.0" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-8.1.0.tgz#1c7817db8bc886e2dbd3fbe3b26ea8e56be0524a" + integrity sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w== + dependencies: + lodash "^4.17.21" + +react-router-dom@^5.2.0: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-scripts@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" + bfj "^7.0.2" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.1" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.1" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" + optionalDependencies: + fsevents "^2.3.2" + +react-smooth@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.3.tgz#2845fa8f22914f2e4445856d5688fb8a7d72f3ae" + integrity sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg== + dependencies: + fast-equals "^5.0.0" + react-transition-group "2.9.0" + +react-spring@^8.0.27: + version "8.0.27" + resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-8.0.27.tgz#97d4dee677f41e0b2adcb696f3839680a3aa356a" + integrity sha512-nDpWBe3ZVezukNRandTeLSPcwwTMjNVu1IDq9qA/AMiUqHuRN4BeSWvKr3eIxxg1vtiYiOLy4FqdfCP5IoP77g== + dependencies: + "@babel/runtime" "^7.3.1" + prop-types "^15.5.8" + +react-table@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.8.0.tgz#07858c01c1718c09f7f1aed7034fcfd7bda907d2" + integrity sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA== + +react-transition-group@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== + dependencies: + dom-helpers "^3.4.0" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.3, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + 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" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recharts-scale@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" + integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== + dependencies: + decimal.js-light "^2.4.1" + +recharts@^2.1.14: + version "2.7.2" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.7.2.tgz#6d813681910ad33a4bbf3bdd06c6f64f20b39319" + integrity sha512-HMKRBkGoOXHW+7JcRa6+MukPSifNtJlqbc+JreGVNA407VLE/vOP+8n3YYjprDVVIF9E2ZgwWnL3D7K/LUFzBg== + dependencies: + classnames "^2.2.5" + eventemitter3 "^4.0.1" + lodash "^4.17.19" + react-is "^16.10.2" + react-resize-detector "^8.0.4" + react-smooth "^2.0.2" + recharts-scale "^0.4.4" + reduce-css-calc "^2.1.8" + victory-vendor "^36.6.8" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reduce-css-calc@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + 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" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +regression@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regression/-/regression-2.0.1.tgz#8d29c3e8224a10850c35e337e85a8b2fac3b0c87" + integrity sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ== + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +reselect@^4.1.6: + version "4.1.8" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +resolve@^1.1.5, resolve@^1.1.7, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rifm@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/rifm/-/rifm-0.12.1.tgz#8fa77f45b7f1cda2a0068787ac821f0593967ac4" + integrity sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +robust-predicates@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup@^2.43.1: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize.css@*: + version "13.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== + +sass-loader@^12.3.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sass@^1.50.1: + version "1.63.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea" + integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +scope-analyzer@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/scope-analyzer/-/scope-analyzer-2.1.2.tgz#b958162feb59823c2835c7b0229187a97c77e9cd" + integrity sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ== + dependencies: + array-from "^2.1.1" + dash-ast "^2.0.1" + es6-map "^0.1.5" + es6-set "^0.1.5" + es6-symbol "^3.1.1" + estree-is-function "^1.0.0" + get-assigned-identifiers "^1.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + 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" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + 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" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-copy@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw== + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +socket.io-client@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.5.0.tgz#34f486f3640dde9c2211fce885ac2746f9baf5cb" + integrity sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw== + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.5.0" + has-binary2 "~1.0.2" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.3.tgz#3a8b84823eba87f3f7624e64a8aaab6d6318a72f" + integrity sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" + integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-support@^0.5.6, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@~0.1.30: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ== + dependencies: + amdefine ">=0.0.4" + +sourcemap-codec@^1.4.1, sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + 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" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + 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" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +static-eval@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + +static-module@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-3.0.4.tgz#bfbd1d1c38dd1fbbf0bb4af0c1b3ae18a93a2b68" + integrity sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw== + dependencies: + acorn-node "^1.3.0" + concat-stream "~1.6.0" + convert-source-map "^1.5.1" + duplexer2 "~0.1.4" + escodegen "^1.11.1" + has "^1.0.1" + magic-string "0.25.1" + merge-source-map "1.0.4" + object-inspect "^1.6.0" + readable-stream "~2.3.3" + scope-analyzer "^2.0.1" + shallow-copy "~0.0.1" + static-eval "^2.0.5" + through2 "~2.0.3" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-length@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" + +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" + integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== + +styled-components@^5.1.1: + version "5.3.11" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.11.tgz#9fda7bf1108e39bf3f3e612fcc18170dedcd57a8" + 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" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +sucrase@^3.32.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7" + integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-arc-to-cubic-bezier@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" + integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + 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" + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tailwindcss@^3.0.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3" + integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.18.2" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" + +terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: + version "5.18.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.1.tgz#6d8642508ae9fb7b48768e48f16d675c89a78460" + integrity sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== + +through2@^2.0.0, through2@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== + +tiny-invariant@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + +tough-cookie@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + 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" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.2.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typescript@^4.6.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + 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" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-properties@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.4.1.tgz#96a9cffb7e619a0dc7368c28da27e05fc8f9be5f" + integrity sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg== + dependencies: + base64-js "^1.3.0" + unicode-trie "^2.0.0" + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unicode-trie@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" + integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + 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" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +victory-vendor@^36.6.8: + version "36.6.11" + resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.6.11.tgz#acae770717c2dae541a54929c304ecab5ab6ac2a" + integrity sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg== + dependencies: + "@types/d3-array" "^3.0.3" + "@types/d3-ease" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-time" "^3.0.0" + "@types/d3-timer" "^3.0.0" + d3-array "^3.1.6" + d3-ease "^3.0.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-shape "^3.1.0" + d3-time "^3.0.0" + d3-timer "^3.0.1" + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-vitals@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" + integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.6.0: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== + dependencies: + tapable "^2.0.0" + webpack-sources "^2.2.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.64.4: + version "5.88.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.0.tgz#a07aa2f8e7a64a8f1cec0c6c2e180e3cb34440c8" + integrity sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + 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" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + 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" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" + integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== + dependencies: + idb "^7.0.1" + workbox-core "6.6.1" + +workbox-broadcast-update@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e" + integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ== + dependencies: + workbox-core "6.6.1" + +workbox-build@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" + integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.6.1" + workbox-broadcast-update "6.6.1" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-google-analytics "6.6.1" + workbox-navigation-preload "6.6.1" + workbox-precaching "6.6.1" + workbox-range-requests "6.6.1" + workbox-recipes "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + workbox-streams "6.6.1" + workbox-sw "6.6.1" + workbox-window "6.6.1" + +workbox-cacheable-response@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" + integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== + dependencies: + workbox-core "6.6.1" + +workbox-core@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265" + integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw== + +workbox-expiration@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" + integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== + dependencies: + idb "^7.0.1" + workbox-core "6.6.1" + +workbox-google-analytics@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" + integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== + dependencies: + workbox-background-sync "6.6.1" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-navigation-preload@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" + integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== + dependencies: + workbox-core "6.6.1" + +workbox-precaching@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2" + integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A== + dependencies: + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-range-requests@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" + integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== + dependencies: + workbox-core "6.6.1" + +workbox-recipes@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" + integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== + dependencies: + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-precaching "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-routing@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581" + integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg== + dependencies: + workbox-core "6.6.1" + +workbox-strategies@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" + integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw== + dependencies: + workbox-core "6.6.1" + +workbox-streams@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" + integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== + dependencies: + workbox-core "6.6.1" + workbox-routing "6.6.1" + +workbox-sw@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" + integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== + +workbox-webpack-plugin@^6.4.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" + integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== + dependencies: + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.6.1" + +workbox-window@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" + integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "6.6.1" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + 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" + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmldoc@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.3.0.tgz#7823225b096c74036347c9ec5924d06b6a3cebab" + integrity sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng== + dependencies: + sax "^1.2.4" + +xmlhttprequest-ssl@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" + integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== + +xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + 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" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yup@^0.32.11: + version "0.32.11" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5" + integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== + dependencies: + "@babel/runtime" "^7.15.4" + "@types/lodash" "^4.14.175" + lodash "^4.17.21" + lodash-es "^4.17.21" + nanoclone "^0.2.1" + property-expr "^2.0.4" + toposort "^2.0.2"