diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 75077296cf..5a15c1aeed 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -3,7 +3,7 @@ # Licensed under the MIT License. See LICENSE file in the project root for license information. #------------------------------------------------------------------------------------------------------------- -FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.7 +FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.9 # # Update the OS and maybe install packages @@ -11,7 +11,7 @@ FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.7 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get upgrade -y \ - && apt-get -y install --no-install-recommends build-essential \ + && apt-get -y install --no-install-recommends build-essential npm \ && apt-get autoremove -y \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/* @@ -20,4 +20,7 @@ ENV DEBIAN_FRONTEND=dialog # # Install extras for development # -RUN pip3 --disable-pip-version-check --no-cache-dir install flaml[test,notebook] \ No newline at end of file +RUN pip3 --disable-pip-version-check --no-cache-dir install flaml[test,notebook] +# For docs +RUN npm install --global yarn +RUN pip install pydoc-markdown diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml new file mode 100644 index 0000000000..4ca9d8f9d4 --- /dev/null +++ b/.github/workflows/deploy-website.yml @@ -0,0 +1,88 @@ +name: docs + +on: + pull_request: + branches: [main] + push: + branches: [main] + workflow_dispatch: + +jobs: + checks: + if: github.event_name != 'push' + runs-on: ubuntu-latest + defaults: + run: + working-directory: website + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14.x + # cache: yarn + # cache-dependency-path: '**/yarn.lock' + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pydoc-markdown install + run: | + python -m pip install --upgrade pip + pip install pydoc-markdown + - name: pydoc-markdown run + run: | + pydoc-markdown + - name: Test Build + run: | + if [ -e yarn.lock ]; then + yarn install --frozen-lockfile + yarn build + elif [ -e package-lock.json ]; then + npm ci + npm run build + else + npm i --legacy-peer-deps + npm run build + fi + gh-release: + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + defaults: + run: + working-directory: website + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14.x + # cache: yarn + # cache-dependency-path: '**/yarn.lock' + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pydoc-markdown install + run: | + python -m pip install --upgrade pip + pip install pydoc-markdown + - name: pydoc-markdown run + run: | + pydoc-markdown + - name: Build website + run: | + if [ -e yarn.lock ]; then + yarn install --frozen-lockfile + yarn build + elif [ -e package-lock.json ]; then + npm ci + npm run build + else + npm i --legacy-peer-deps + npm run build + fi + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + # Build output to publish to the `gh-pages` branch: + publish_dir: ./website/build diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 0aa22130a3..cebff3fbe1 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -70,27 +70,27 @@ jobs: file: ./coverage.xml flags: unittests - docs: + # docs: - runs-on: ubuntu-latest + # runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: '3.8' - - name: Compile documentation - run: | - pip install -e . - python -m pip install sphinx sphinx_rtd_theme - cd docs - make html - - name: Deploy to GitHub pages - if: ${{ github.ref == 'refs/heads/main' }} - uses: JamesIves/github-pages-deploy-action@3.6.2 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: docs/_build/html - CLEAN: true \ No newline at end of file + # steps: + # - uses: actions/checkout@v2 + # - name: Setup Python + # uses: actions/setup-python@v2 + # with: + # python-version: '3.8' + # - name: Compile documentation + # run: | + # pip install -e . + # python -m pip install sphinx sphinx_rtd_theme + # cd docs + # make html + # - name: Deploy to GitHub pages + # if: ${{ github.ref == 'refs/heads/main' }} + # uses: JamesIves/github-pages-deploy-action@3.6.2 + # with: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # BRANCH: gh-pages + # FOLDER: docs/_build/html + # CLEAN: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6de9441494..c3452c202b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# Project +# Project /.vs .vscode diff --git a/Dockerfile b/Dockerfile index 35e629da39..6447fe5bf5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # basic setup FROM python:3.7 RUN apt-get update && apt-get -y update -RUN apt-get install -y sudo git +RUN apt-get install -y sudo git npm # Setup user to not run as root RUN adduser --disabled-password --gecos '' flaml-dev @@ -19,6 +19,12 @@ RUN sudo pip install -e .[test,notebook] # Install precommit hooks RUN pre-commit install +# For docs +RUN npm install --global yarn +RUN pip install pydoc-markdown +RUN cd website +RUN yarn install --frozen-lockfile + # override default image starting point CMD /bin/bash ENTRYPOINT [] diff --git a/README.md b/README.md index b91ef7806c..03324c237c 100644 --- a/README.md +++ b/README.md @@ -2,27 +2,28 @@ ![Conda version](https://img.shields.io/conda/vn/conda-forge/flaml) [![Build](https://github.com/microsoft/FLAML/actions/workflows/python-package.yml/badge.svg)](https://github.com/microsoft/FLAML/actions/workflows/python-package.yml) ![Python Version](https://img.shields.io/badge/3.6%20%7C%203.7%20%7C%203.8%20%7C%203.9-blue) -[![Downloads](https://pepy.tech/badge/flaml/month)](https://pepy.tech/project/flaml) +[![Downloads](https://pepy.tech/badge/flaml)](https://pepy.tech/project/flaml) [![Join the chat at https://gitter.im/FLAMLer/community](https://badges.gitter.im/FLAMLer/community.svg)](https://gitter.im/FLAMLer/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -# FLAML - Fast and Lightweight AutoML +# A Fast Library for Automated Machine Learning & Tuning

- +

FLAML is a lightweight Python library that finds accurate machine learning models automatically, efficiently and economically. It frees users from selecting -learners and hyperparameters for each learner. It is fast and economical. -The simple and lightweight design makes it easy to extend, such as -adding customized learners or metrics. FLAML is powered by a new, [cost-effective -hyperparameter optimization](https://github.com/microsoft/FLAML/tree/main/flaml/tune) +learners and hyperparameters for each learner. + +1. For common machine learning tasks like classification and regression, it quickly finds quality models for user-provided data with low computational resources. It supports both classifcal machine learning models and deep neural networks. +1. It is easy to customize or extend. Users can choose their desired customizability: minimal customization (computational resource budget), medium customization (e.g., scikit-style learner, search space and metric), or full customization (arbitrary training and evaluation code). +1. It supports fast automatic tuning, capable of handling complex constraints/guidance/early stopping. FLAML is powered by a new, [cost-effective +hyperparameter optimization](https://microsoft.github.io/FLAML/Use-Cases/Tune-User-Defined-Function#hyperparameter-optimization-algorithm) and learner selection method invented by Microsoft Research. -FLAML leverages the structure of the search space to choose a search order optimized for both cost and error. For example, the system tends to propose cheap configurations at the beginning stage of the search, -but quickly moves to configurations with high model complexity and large sample size when needed in the later stage of the search. For another example, it favors cheap learners in the beginning but penalizes them later if the error improvement is slow. The cost-bounded search and cost-based prioritization make a big difference in the search efficiency under budget constraints. -FLAML has a .NET implementation as well from [ML.NET Model Builder](https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet/model-builder). This [ML.NET blog](https://devblogs.microsoft.com/dotnet/ml-net-june-updates/#new-and-improved-automl) describes the improvement brought by FLAML. +FLAML has a .NET implementation as well from [ML.NET Model Builder](https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet/model-builder) in [Visual Studio](https://visualstudio.microsoft.com/) 2022. This [ML.NET blog](https://devblogs.microsoft.com/dotnet/ml-net-june-updates/#new-and-improved-automl) describes the improvement brought by FLAML. + ## Installation @@ -57,157 +58,26 @@ tool for XGBoost, LightGBM, Random Forest etc. or a customized learner. automl.fit(X_train, y_train, task="classification", estimator_list=["lgbm"]) ``` -* You can also run generic ray-tune style hyperparameter tuning for a custom function. +* You can also run generic hyperparameter tuning for a custom function. ```python from flaml import tune -tune.run(train_with_config, config={…}, low_cost_partial_config={…}, time_budget_s=3600) -``` - -## Advantages - -* For common machine learning tasks like classification and regression, find quality models with small computational resources. -* Users can choose their desired customizability: minimal customization (computational resource budget), medium customization (e.g., scikit-style learner, search space and metric), full customization (arbitrary training and evaluation code). -* Allow human guidance in hyperparameter tuning to respect prior on certain subspaces but also able to explore other subspaces. Read more about the -hyperparameter optimization methods -in FLAML [here](https://github.com/microsoft/FLAML/tree/main/flaml/tune). They can be used beyond the AutoML context. -And they can be used in distributed HPO frameworks such as ray tune or nni. -* Support online AutoML: automatic hyperparameter tuning for online learning algorithms. Read more about the online AutoML method in FLAML [here](https://github.com/microsoft/FLAML/tree/main/flaml/onlineml). - -## Examples - -* A basic classification example. - -```python -from flaml import AutoML -from sklearn.datasets import load_iris -# Initialize an AutoML instance -automl = AutoML() -# Specify automl goal and constraint -automl_settings = { - "time_budget": 10, # in seconds - "metric": 'accuracy', - "task": 'classification', - "log_file_name": "iris.log", -} -X_train, y_train = load_iris(return_X_y=True) -# Train with labeled input data -automl.fit(X_train=X_train, y_train=y_train, - **automl_settings) -# Predict -print(automl.predict_proba(X_train)) -# Print the best model -print(automl.model.estimator) -``` - -* A basic regression example. - -```python -from flaml import AutoML -from sklearn.datasets import fetch_california_housing -# Initialize an AutoML instance -automl = AutoML() -# Specify automl goal and constraint -automl_settings = { - "time_budget": 10, # in seconds - "metric": 'r2', - "task": 'regression', - "log_file_name": "california.log", -} -X_train, y_train = fetch_california_housing(return_X_y=True) -# Train with labeled input data -automl.fit(X_train=X_train, y_train=y_train, - **automl_settings) -# Predict -print(automl.predict(X_train)) -# Print the best model -print(automl.model.estimator) -``` - -* A basic time series forecasting example. - -```python -# pip install "flaml[ts_forecast]" -import numpy as np -from flaml import AutoML -X_train = np.arange('2014-01', '2021-01', dtype='datetime64[M]') -y_train = np.random.random(size=72) -automl = AutoML() -automl.fit(X_train=X_train[:72], # a single column of timestamp - y_train=y_train, # value for each timestamp - period=12, # time horizon to forecast, e.g., 12 months - task='ts_forecast', time_budget=15, # time budget in seconds - log_file_name="ts_forecast.log", - ) -print(automl.predict(X_train[72:])) -``` - -* Learning to rank. - -```python -from sklearn.datasets import fetch_openml -from flaml import AutoML -X_train, y_train = fetch_openml(name="credit-g", return_X_y=True, as_frame=False) -# not a real learning to rank dataaset -groups = [200] * 4 + [100] * 2 # group counts -automl = AutoML() -automl.fit( - X_train, y_train, groups=groups, - task='rank', time_budget=10, # in seconds -) -``` - -* Fine tuning language model. - -```python -# pip install "flaml[nlp]" -from flaml import AutoML -from datasets import load_dataset - -train_dataset = load_dataset("glue", "mrpc", split="train").to_pandas() -dev_dataset = load_dataset("glue", "mrpc", split="validation").to_pandas() -test_dataset = load_dataset("glue", "mrpc", split="test").to_pandas() -custom_sent_keys = ["sentence1", "sentence2"] -label_key = "label" -X_train, y_train = train_dataset[custom_sent_keys], train_dataset[label_key] -X_val, y_val = dev_dataset[custom_sent_keys], dev_dataset[label_key] -X_test = test_dataset[custom_sent_keys] - -automl = AutoML() -automl_settings = { - "time_budget": 100, - "task": "seq-classification", - "custom_hpo_args": {"output_dir": "data/output/"}, - "gpu_per_trial": 1, # set to 0 if no GPU is available -} -automl.fit(X_train=X_train, y_train=y_train, X_val=X_val, y_val=y_val, **automl_settings) -automl.predict(X_test) +tune.run(evaluation_function, config={…}, low_cost_partial_config={…}, time_budget_s=3600) ``` -More examples can be found in [notebooks](https://github.com/microsoft/FLAML/tree/main/notebook/). - ## Documentation -Please find the API documentation [here](https://microsoft.github.io/FLAML/). +You can find a detailed documentation about FLAML [here](https://microsoft.github.io/FLAML/) where you can find the API documentation, use cases and examples. -Please find demo and tutorials of FLAML [here](https://www.youtube.com/channel/UCfU0zfFXHXdAd5x-WvFBk5A). +In addition, you can find: -For more technical details, please check our papers. +- Demo and tutorials of FLAML [here](https://www.youtube.com/channel/UCfU0zfFXHXdAd5x-WvFBk5A). -* [FLAML: A Fast and Lightweight AutoML Library](https://www.microsoft.com/en-us/research/publication/flaml-a-fast-and-lightweight-automl-library/). Chi Wang, Qingyun Wu, Markus Weimer, Erkang Zhu. MLSys 2021. +- Research around FLAML [here](https://microsoft.github.io/FLAML/docs/Research). -```bibtex -@inproceedings{wang2021flaml, - title={FLAML: A Fast and Lightweight AutoML Library}, - author={Chi Wang and Qingyun Wu and Markus Weimer and Erkang Zhu}, - year={2021}, - booktitle={MLSys}, -} -``` +- FAQ [here](https://microsoft.github.io/FLAML/docs/FAQ). -* [Frugal Optimization for Cost-related Hyperparameters](https://arxiv.org/abs/2005.01571). Qingyun Wu, Chi Wang, Silu Huang. AAAI 2021. -* [Economical Hyperparameter Optimization With Blended Search Strategy](https://www.microsoft.com/en-us/research/publication/economical-hyperparameter-optimization-with-blended-search-strategy/). Chi Wang, Qingyun Wu, Silu Huang, Amin Saied. ICLR 2021. -* [ChaCha for Online AutoML](https://www.microsoft.com/en-us/research/publication/chacha-for-online-automl/). Qingyun Wu, Chi Wang, John Langford, Paul Mineiro and Marco Rossi. ICML 2021. +- Contributing guide [here](https://microsoft.github.io/FLAML/docs/Contribute). ## Contributing @@ -224,54 +94,3 @@ provided by the bot. You will only need to do this once across all repos using o This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - -## Developing - -### Setup - -```bash -git clone https://github.com/microsoft/FLAML.git -pip install -e .[test,notebook] -``` - -### Docker - -We provide a simple [Dockerfile](https://github.com/microsoft/FLAML/blob/main/Dockerfile). - -```bash -docker build git://github.com/microsoft/FLAML -t flaml-dev -docker run -it flaml-dev -``` - -### Develop in Remote Container - -If you use vscode, you can open the FLAML folder in a [Container](https://code.visualstudio.com/docs/remote/containers). -We have provided the configuration in [.devcontainer]((https://github.com/microsoft/FLAML/blob/main/.devcontainer)). - -### Pre-commit - -Run `pre-commit install` to install pre-commit into your git hooks. Before you commit, run -`pre-commit run` to check if you meet the pre-commit requirements. If you use Windows (without WSL) and can't commit after installing pre-commit, you can run `pre-commit uninstall` to uninstall the hook. In WSL or Linux this is supposed to work. - -### Coverage - -Any code you commit should not decrease coverage. To run all unit tests: - -```bash -coverage run -m pytest test -``` - -Then you can see the coverage report by -`coverage report -m` or `coverage html`. -If all the tests are passed, please also test run notebook/flaml_automl to make sure your commit does not break the notebook example. - -## Authors - -* Chi Wang -* Qingyun Wu - -Contributors (alphabetical order): Amir Aghaei, Vijay Aski, Sebastien Bubeck, Surajit Chaudhuri, Nadiia Chepurko, Ofer Dekel, Alex Deng, Anshuman Dutt, Nicolo Fusi, Jianfeng Gao, Johannes Gehrke, Niklas Gustafsson, Silu Huang, Dongwoo Kim, Christian Konig, John Langford, Menghao Li, Mingqin Li, Zhe Liu, Naveen Gaur, Paul Mineiro, Vivek Narasayya, Jake Radzikowski, Marco Rossi, Amin Saied, Neil Tenenholtz, Olga Vrousgou, Markus Weimer, Yue Wang, Qingyun Wu, Qiufeng Yin, Haozhe Zhang, Minjia Zhang, XiaoYun Zhang, Eric Zhu, and open-source contributors. - -## License - -[MIT License](LICENSE) diff --git a/docs/images/FLOW2.png b/docs/images/FLOW2.png deleted file mode 100644 index f29128c83e..0000000000 Binary files a/docs/images/FLOW2.png and /dev/null differ diff --git a/flaml/automl.py b/flaml/automl.py index 95dfeb8caa..2b56650d1f 100644 --- a/flaml/automl.py +++ b/flaml/automl.py @@ -379,10 +379,10 @@ def _trainable_function_wrapper(config: dict): def size(state: AutoMLState, config: dict) -> float: - """Size function + """Size function. Returns: - The mem size in bytes for a config + The mem size in bytes for a config. """ config = config.get("ml", config) estimator = config["learner"] @@ -392,20 +392,18 @@ def size(state: AutoMLState, config: dict) -> float: class AutoML(BaseEstimator): """The AutoML class. - Example: - .. code-block:: python - - automl = AutoML() - automl_settings = { - "time_budget": 60, - "metric": 'accuracy', - "task": 'classification', - "log_file_name": 'mylog.log', - } - automl.fit(X_train = X_train, y_train = y_train, - **automl_settings) + ```python + automl = AutoML() + automl_settings = { + "time_budget": 60, + "metric": 'accuracy', + "task": 'classification', + "log_file_name": 'mylog.log', + } + automl.fit(X_train = X_train, y_train = y_train, **automl_settings) + ``` """ @@ -425,42 +423,40 @@ def __init__(self, **settings): 'mape'. Default is 'auto'. If passing a customized metric function, the function needs to have the follwing signature: - - .. code-block:: python - - def custom_metric( - X_val, y_val, estimator, labels, - X_train, y_train, weight_val=None, weight_train=None, - config=None, groups_val=None, groups_train=None, - ): - return metric_to_minimize, metrics_to_log + ```python + def custom_metric( + X_test, y_test, estimator, labels, + X_train, y_train, weight_test=None, weight_train=None, + config=None, groups_test=None, groups_train=None, + ): + return metric_to_minimize, metrics_to_log + ``` which returns a float number as the minimization objective, and a dictionary as the metrics to log. E.g., - .. code-block:: python - - def custom_metric( - X_val, y_val, estimator, labels, - X_train, y_train, weight_val=None, weight_train=None, - **args, - ): - from sklearn.metrics import log_loss - import time - - start = time.time() - y_pred = estimator.predict_proba(X_val) - pred_time = (time.time() - start) / len(X_val) - val_loss = log_loss(y_val, y_pred, labels=labels, sample_weight=weight_val) - y_pred = estimator.predict_proba(X_train) - train_loss = log_loss(y_train, y_pred, labels=labels, sample_weight=weight_train) - alpha = 0.5 - return val_loss * (1 + alpha) - alpha * train_loss, { - "val_loss": val_loss, - "train_loss": train_loss, - "pred_time": pred_time, - } - + ```python + def custom_metric( + X_val, y_val, estimator, labels, + X_train, y_train, weight_val=None, weight_train=None, + **args, + ): + from sklearn.metrics import log_loss + import time + + start = time.time() + y_pred = estimator.predict_proba(X_val) + pred_time = (time.time() - start) / len(X_val) + val_loss = log_loss(y_val, y_pred, labels=labels, sample_weight=weight_val) + y_pred = estimator.predict_proba(X_train) + train_loss = log_loss(y_train, y_pred, labels=labels, sample_weight=weight_train) + alpha = 0.5 + return val_loss * (1 + alpha) - alpha * train_loss, { + "val_loss": val_loss, + "train_loss": train_loss, + "pred_time": pred_time, + } + ``` task: A string of the task type, e.g., 'classification', 'regression', 'ts_forecast', 'rank', 'seq-classification', 'seq-regression'. @@ -469,11 +465,7 @@ def custom_metric( log_file_name: A string of the log file name. To disable logging, set it to be an empty string "". estimator_list: A list of strings for estimator names, or 'auto' - e.g., - - .. code-block:: python - - ['lgbm', 'xgboost', 'xgb_limitdepth', 'catboost', 'rf', 'extra_tree'] + e.g., ```['lgbm', 'xgboost', 'xgb_limitdepth', 'catboost', 'rf', 'extra_tree']``` time_budget: A float number of the time budget in seconds. Use -1 if no time limit. @@ -533,28 +525,28 @@ def custom_metric( The value can be a single hyperparamter configuration dict or a list of hyperparamter configuration dicts. In the following code example, we get starting_points from the - automl_experiment and use them in the new_automl_experiment. + `automl` object and use them in the `new_automl` object. e.g., - .. code-block:: python - from flaml import AutoML - automl_experiment = AutoML() - X_train, y_train = load_iris(return_X_y=True) - automl_experiment.fit(X_train, y_train) - starting_points = automl_experiment.best_config_per_estimator + ```python + from flaml import AutoML + automl = AutoML() + X_train, y_train = load_iris(return_X_y=True) + automl.fit(X_train, y_train) + starting_points = automl.best_config_per_estimator - new_automl_experiment = AutoML() - new_automl_experiment.fit(X_train, y_train, - starting_points=starting_points) + new_automl = AutoML() + new_automl.fit(X_train, y_train, starting_points=starting_points) + ``` seed: int or None, default=None | The random seed for np.random. n_concurrent_trials: [Experimental] int, default=1 | The number of concurrent trials. For n_concurrent_trials > 1, installation of ray is required: `pip install flaml[ray]`. - keep_search_state: boolean, default=False | Whether to keep search - state after fit(). By default the state is deleted for space - saving. + keep_search_state: boolean, default=False | Whether to keep data needed + for model search after fit(). By default the state is deleted for + space saving. early_stop: boolean, default=False | Whether to stop early if the search is considered to converge. append_log: boolean, default=False | Whetehr to directly append the log @@ -634,8 +626,10 @@ def best_model_for_estimator(self, estimator_name): estimator_name: a str of the estimator's name. Returns: - An object with `predict()` and `predict_proba()` method (for - classification), storing the best trained model for estimator_name. + An object storing the best model for estimator_name. + If `model_history` was set to False during fit(), then the returned model + is untrained unless estimator_name is the best estimator. + If `model_history` was set to True, then the returned model is trained. """ state = self._search_states.get(estimator_name) return state and getattr(state, "trained_estimator", None) @@ -725,17 +719,17 @@ def predict( are assumed to be exogenous variables (categorical or numeric). - .. code-block:: python - - multivariate_X_test = pd.DataFrame({ - 'timeStamp': pd.date_range(start='1/1/2022', end='1/07/2022'), - 'categorical_col': ['yes', 'yes', 'no', 'no', 'yes', 'no', 'yes'], - 'continuous_col': [105, 107, 120, 118, 110, 112, 115] - }) - model.predict(multivariate_X_test) + ```python + multivariate_X_test = pd.DataFrame({ + 'timeStamp': pd.date_range(start='1/1/2022', end='1/07/2022'), + 'categorical_col': ['yes', 'yes', 'no', 'no', 'yes', 'no', 'yes'], + 'continuous_col': [105, 107, 120, 118, 110, 112, 115] + }) + model.predict(multivariate_X_test) + ``` Returns: - A array-like of shape n * 1 - - each element is a predicted + A array-like of shape n * 1: each element is a predicted label for an instance. """ estimator = getattr(self, "_trained_estimator", None) @@ -1542,10 +1536,10 @@ def cat_hp_cost(self) -> dict: @property def points_to_evaluate(self) -> dict: - """Initial points to evaluate + """Initial points to evaluate. Returns: - A list of dicts. Each dict is the initial point for each learner + A list of dicts. Each dict is the initial point for each learner. """ points = [] for estimator in self.estimator_list: @@ -1711,14 +1705,14 @@ def fit( If passing a customized metric function, the function needs to have the follwing signature: - .. code-block:: python - - def custom_metric( - X_val, y_val, estimator, labels, - X_train, y_train, weight_val=None, weight_train=None, - config=None, groups_val=None, groups_train=None, - ): - return metric_to_minimize, metrics_to_log + ```python + def custom_metric( + X_test, y_test, estimator, labels, + X_train, y_train, weight_test=None, weight_train=None, + config=None, groups_test=None, groups_train=None, + ): + return metric_to_minimize, metrics_to_log + ``` which returns a float number as the minimization objective, and a dictionary as the metrics to log. E.g., @@ -1754,11 +1748,7 @@ def custom_metric( log_file_name: A string of the log file name. To disable logging, set it to be an empty string "". estimator_list: A list of strings for estimator names, or 'auto' - e.g., - - .. code-block:: python - - ['lgbm', 'xgboost', 'xgb_limitdepth', 'catboost', 'rf', 'extra_tree'] + e.g., ```['lgbm', 'xgboost', 'xgb_limitdepth', 'catboost', 'rf', 'extra_tree']``` time_budget: A float number of the time budget in seconds. Use -1 if no time limit. @@ -1777,8 +1767,10 @@ def custom_metric( ['better', 'all']. 'better' only logs configs with better loss than previos iters 'all' logs all the tried configs. - model_history: A boolean of whether to keep the best + model_history: A boolean of whether to keep the trained best model per estimator. Make sure memory is large enough if setting to True. + Default value is False: best_model_for_estimator would return a + untrained model for non-best learner. log_training_metric: A boolean of whether to log the training metric for each model. mem_thres: A float of the memory size constraint in bytes. @@ -1828,28 +1820,27 @@ def custom_metric( The value can be a single hyperparamter configuration dict or a list of hyperparamter configuration dicts. In the following code example, we get starting_points from the - automl_experiment and use them in the new_automl_experiment. + `automl` object and use them in the `new_automl` object. e.g., - .. code-block:: python - - from flaml import AutoML - automl_experiment = AutoML() - X_train, y_train = load_iris(return_X_y=True) - automl_experiment.fit(X_train, y_train) - starting_points = automl_experiment.best_config_per_estimator + ```python + from flaml import AutoML + automl = AutoML() + X_train, y_train = load_iris(return_X_y=True) + automl.fit(X_train, y_train) + starting_points = automl.best_config_per_estimator - new_automl_experiment = AutoML() - new_automl_experiment.fit(X_train, y_train, - starting_points=starting_points) + new_automl = AutoML() + new_automl.fit(X_train, y_train, starting_points=starting_points) + ``` seed: int or None, default=None | The random seed for np.random. n_concurrent_trials: [Experimental] int, default=1 | The number of concurrent trials. For n_concurrent_trials > 1, installation of ray is required: `pip install flaml[ray]`. - keep_search_state: boolean, default=False | Whether to keep search - state after fit(). By default the state is deleted for space - saving. + keep_search_state: boolean, default=False | Whether to keep data needed + for model search after fit(). By default the state is deleted for + space saving. early_stop: boolean, default=False | Whether to stop early if the search is considered to converge. append_log: boolean, default=False | Whetehr to directly append the log diff --git a/flaml/data.py b/flaml/data.py index 427414bdbc..321041adcb 100644 --- a/flaml/data.py +++ b/flaml/data.py @@ -44,18 +44,19 @@ def load_openml_dataset( If the file is not cached locally, download it from open ML. Args: - dataset_id: An integer of the dataset id in openml - data_dir: A string of the path to store and load the data - random_state: An integer of the random seed for splitting data + dataset_id: An integer of the dataset id in openml. + data_dir: A string of the path to store and load the data. + random_state: An integer of the random seed for splitting data. dataset_format: A string specifying the format of returned dataset. Default is 'dataframe'. Can choose from ['dataframe', 'array']. If 'dataframe', the returned dataset will be a Pandas DataFrame. If 'array', the returned dataset will be a NumPy array or a SciPy sparse matrix. + Returns: - X_train: Training data - X_test: Test data - y_train: A series or array of labels for training data - y_test: A series or array of labels for test data + X_train: Training data. + X_test: Test data. + y_train: A series or array of labels for training data. + y_test: A series or array of labels for test data. """ import os import openml @@ -98,14 +99,14 @@ def load_openml_task(task_id, data_dir): If the file is not cached locally, download it from open ML. Args: - task_id: An integer of the task id in openml - data_dir: A string of the path to store and load the data + task_id: An integer of the task id in openml. + data_dir: A string of the path to store and load the data. Returns: - X_train: A dataframe of training data - X_test: A dataframe of test data - y_train: A series of labels for training data - y_test: A series of labels for test data + X_train: A dataframe of training data. + X_test: A dataframe of test data. + y_train: A series of labels for training data. + y_test: A series of labels for test data. """ import os import openml @@ -145,7 +146,7 @@ def load_openml_task(task_id, data_dir): def get_output_from_log(filename, time_budget): - """Get output from log file + """Get output from log file. Args: filename: A string of the log file name. @@ -208,7 +209,7 @@ def get_output_from_log(filename, time_budget): def concat(X1, X2): - """concatenate two matrices vertically""" + """concatenate two matrices vertically.""" if isinstance(X1, (DataFrame, Series)): df = pd.concat([X1, X2], sort=False) df.reset_index(drop=True, inplace=True) diff --git a/flaml/model.py b/flaml/model.py index 95f2c8f68b..dbcc3ca08b 100644 --- a/flaml/model.py +++ b/flaml/model.py @@ -75,10 +75,10 @@ class BaseEstimator: """The abstract class for all learners. Typical examples: - * XGBoostEstimator: for regression. - * XGBoostSklearnEstimator: for classification. - * LGBMEstimator, RandomForestEstimator, LRL1Classifier, LRL2Classifier: - for both regression and classification. + * XGBoostEstimator: for regression. + * XGBoostSklearnEstimator: for classification. + * LGBMEstimator, RandomForestEstimator, LRL1Classifier, LRL2Classifier: + for both regression and classification. """ def __init__(self, task="binary", **config): @@ -86,7 +86,7 @@ def __init__(self, task="binary", **config): Args: task: A string of the task type, one of - 'binary', 'multi', 'regression', 'rank', 'forecast' + 'binary', 'multi', 'regression', 'rank', 'forecast'. config: A dictionary containing the hyperparameter names, 'n_jobs' as keys. n_jobs is the number of parallel threads. """ @@ -209,6 +209,9 @@ def predict(self, X_test): X_test = self._preprocess(X_test) return self._model.predict(X_test) else: + logger.warning( + "Estimator is not fit yet. Please run fit() before predict()." + ) return np.ones(X_test.shape[0]) def predict_proba(self, X_test): @@ -247,8 +250,7 @@ def search_space(cls, data_size, task, **params): Each key is the name of a hyperparameter, and value is a dict with its domain (required) and low_cost_init_value, init_value, cat_hp_cost (if applicable). - e.g., - `{'domain': tune.randint(lower=1, upper=10), 'init_value': 1}.` + e.g., ```{'domain': tune.randint(lower=1, upper=10), 'init_value': 1}```. """ return {} @@ -602,8 +604,8 @@ def _compute_metrics_by_dataset_name(self, eval_pred): return { "val_loss": metric_loss_score( metric_name=self._metric_name, y_predict=predictions, y_true=labels - ) - } + ) + } def predict_proba(self, X_test): from datasets import Dataset diff --git a/flaml/nlp/huggingface/switch_head_auto.py b/flaml/nlp/huggingface/switch_head_auto.py index 8eef47a675..f909df67aa 100644 --- a/flaml/nlp/huggingface/switch_head_auto.py +++ b/flaml/nlp/huggingface/switch_head_auto.py @@ -21,7 +21,7 @@ class AutoSeqClassificationHead: """ This is a class for getting classification head class based on the name of the LM instantiated as one of the ClassificationHead classes of the library when - created with the `~flaml.nlp.huggingface.AutoSeqClassificationHead.from_model_type_and_config` method. + created with the `AutoSeqClassificationHead.from_model_type_and_config` method. This class cannot be instantiated directly using ``__init__()`` (throws an error). """ @@ -33,26 +33,31 @@ def __init__(self): ) @classmethod - def from_model_type_and_config(cls, model_type, config): + def from_model_type_and_config( + cls, model_type: str, config: transformers.PretrainedConfig + ): """ Instantiate one of the classification head classes from the mode_type and model configuration. Args: - model_type: - A string, which desribes the model type, e.g., "electra" - config (:class:`~transformers.PretrainedConfig`): - The huggingface class of the model's configuration: - - Examples:: - >>> from transformers import AutoConfig - >>> model_config = AutoConfig.from_pretrained("google/electra-base-discriminator") - >>> AutoSeqClassificationHead.from_model_type_and_config("electra", model_config) + model_type: A string, which desribes the model type, e.g., "electra". + config: The huggingface class of the model's configuration. + + Example: + + ```python + from transformers import AutoConfig + model_config = AutoConfig.from_pretrained("google/electra-base-discriminator") + AutoSeqClassificationHead.from_model_type_and_config("electra", model_config) + ``` """ if model_type in MODEL_CLASSIFICATION_HEAD_MAPPING.keys(): return MODEL_CLASSIFICATION_HEAD_MAPPING[model_type](config) raise ValueError( "Unrecognized configuration class {} for class {}.\n" "Model type should be one of {}.".format( - config.__class__, cls.__name__, ", ".join(MODEL_CLASSIFICATION_HEAD_MAPPING.keys()) + config.__class__, + cls.__name__, + ", ".join(MODEL_CLASSIFICATION_HEAD_MAPPING.keys()), ) ) diff --git a/flaml/nlp/huggingface/trainer.py b/flaml/nlp/huggingface/trainer.py index a4a005605c..7b944074f2 100644 --- a/flaml/nlp/huggingface/trainer.py +++ b/flaml/nlp/huggingface/trainer.py @@ -15,7 +15,7 @@ def evaluate( metric_key_prefix="eval", is_seq2seq=False, ): - """Overriding transformers.Trainer.evaluate by saving metrics and checkpoint path""" + """Overriding transformers.Trainer.evaluate by saving metrics and checkpoint path.""" from transformers.trainer_utils import PREFIX_CHECKPOINT_DIR ckpt_dir = os.path.join( diff --git a/flaml/nlp/utils.py b/flaml/nlp/utils.py index 27edd65554..171d98afa5 100644 --- a/flaml/nlp/utils.py +++ b/flaml/nlp/utils.py @@ -269,20 +269,16 @@ def compute_checkpoint_freq( @dataclass class HPOArgs: - """The HPO setting + """The HPO setting. Args: - output_dir (:obj:`str`): - data root directory for outputing the log, etc. - model_path (:obj:`str`, `optional`, defaults to :obj:`facebook/muppet-roberta-base`): - A string, the path of the language model file, either a path from huggingface - model card huggingface.co/models, or a local path for the model - fp16 (:obj:`bool`, `optional`, defaults to :obj:`False`): - A bool, whether to use FP16 - max_seq_length (:obj:`int`, `optional`, defaults to :obj:`128`): - An integer, the max length of the sequence - ckpt_per_epoch (:obj:`int`, `optional`, defaults to :obj:`1`): - An integer, the number of checkpoints per epoch + output_dir (str): data root directory for outputing the log, etc. + model_path (str, optional, defaults to "facebook/muppet-roberta-base"): A string, + the path of the language model file, either a path from huggingface + model card huggingface.co/models, or a local path for the model. + fp16 (bool, optional, defaults to "False"): A bool, whether to use FP16. + max_seq_length (int, optional, defaults to 128): An integer, the max length of the sequence. + ckpt_per_epoch (int, optional, defaults to 1): An integer, the number of checkpoints per epoch. """ diff --git a/flaml/onlineml/README.md b/flaml/onlineml/README.md index bbd81d35e7..9eabc11b62 100644 --- a/flaml/onlineml/README.md +++ b/flaml/onlineml/README.md @@ -44,4 +44,4 @@ autovw = AutoVW(max_live_model_num=5, search_space=search_space_nilr, init_confi A user can use the resulting AutoVW instances `autovw` in a similar way to a vanilla Vowpal Wabbit instance, i.e., `pyvw.vw`, to perform online learning by iteratively calling its `predict(data_example)` and `learn(data_example)` functions at each data example. For more examples, please check out -[AutoVW notebook](https://github.com/microsoft/FLAML/blob/main/notebook/flaml_autovw.ipynb). \ No newline at end of file +[AutoVW notebook](https://github.com/microsoft/FLAML/blob/main/notebook/autovw.ipynb). \ No newline at end of file diff --git a/flaml/onlineml/autovw.py b/flaml/onlineml/autovw.py index dbb611b138..1ec4e6cbb4 100644 --- a/flaml/onlineml/autovw.py +++ b/flaml/onlineml/autovw.py @@ -16,7 +16,7 @@ class AutoVW: - """class for the AutoVW algorithm.""" + """Class for the AutoVW algorithm.""" WARMSTART_NUM = 100 AUTOMATIC = "_auto" @@ -53,23 +53,27 @@ def __init__( automl_runner_args: A dictionary of configuration for the OnlineTrialRunner. If set {}, default values will be used, which is equivalent to using the following configs. - .. code-block:: python + Example: - automl_runner_args = - {"champion_test_policy": 'loss_ucb',# the statistic test for a better champion - "remove_worse": False, # whether to do worse than test - } + ```python + automl_runner_args = { + "champion_test_policy": 'loss_ucb', # the statistic test for a better champion + "remove_worse": False, # whether to do worse than test + } + ``` scheduler_args: A dictionary of configuration for the scheduler. If set {}, default values will be used, which is equivalent to using the following config. - .. code-block:: python + Example: - scheduler_args = - {"keep_challenger_metric": 'ucb', # what metric to use when deciding the top performing challengers - "keep_challenger_ratio": 0.5, # denotes the ratio of top performing challengers to keep live - "keep_champion": True, # specifcies whether to keep the champion always running - } + ```python + scheduler_args = { + "keep_challenger_metric": 'ucb', # what metric to use when deciding the top performing challengers + "keep_challenger_ratio": 0.5, # denotes the ratio of top performing challengers to keep live + "keep_champion": True, # specifcies whether to keep the champion always running + } + ``` model_select_policy: A string in ['threshold_loss_ucb', 'threshold_loss_lcb', 'threshold_loss_avg', 'loss_ucb', 'loss_lcb', diff --git a/flaml/onlineml/trial.py b/flaml/onlineml/trial.py index 5d4feafb3b..d04126c053 100644 --- a/flaml/onlineml/trial.py +++ b/flaml/onlineml/trial.py @@ -47,7 +47,7 @@ def get_ns_feature_dim_from_vw_example(vw_example) -> dict: class OnlineResult: - """class for managing the result statistics of a trial.""" + """Class for managing the result statistics of a trial.""" prob_delta = 0.1 LOSS_MIN = 0.0 diff --git a/flaml/onlineml/trial_runner.py b/flaml/onlineml/trial_runner.py index 5510ac977f..7ef7e119ed 100644 --- a/flaml/onlineml/trial_runner.py +++ b/flaml/onlineml/trial_runner.py @@ -9,7 +9,7 @@ class OnlineTrialRunner: - """class for the OnlineTrialRunner.""" + """Class for the OnlineTrialRunner.""" # ************NOTE about the status of a trial*************** # Trial.PENDING: All trials are set to be pending when frist added into the OnlineTrialRunner until diff --git a/flaml/searcher/blendsearch.py b/flaml/searcher/blendsearch.py index 39aa7f0586..5317ea35c6 100644 --- a/flaml/searcher/blendsearch.py +++ b/flaml/searcher/blendsearch.py @@ -68,22 +68,12 @@ def __init__( space: A dictionary to specify the search space. low_cost_partial_config: A dictionary from a subset of controlled dimensions to the initial low-cost values. - e.g., - - .. code-block:: python - - {'n_estimators': 4, 'max_leaves': 4} - + E.g., ```{'n_estimators': 4, 'max_leaves': 4}```. cat_hp_cost: A dictionary from a subset of categorical dimensions to the relative cost of each choice. - e.g., - - .. code-block:: python - - {'tree_method': [1, 1, 2]} - - i.e., the relative cost of the - three choices of 'tree_method' is 1, 1 and 2 respectively. + E.g., ```{'tree_method': [1, 1, 2]}```. + I.e., the relative cost of the three choices of 'tree_method' + is 1, 1 and 2 respectively. points_to_evaluate: Initial parameter suggestions to be run first. evaluated_rewards (list): If you have previously evaluated the parameters passed in as points_to_evaluate you can avoid @@ -105,17 +95,12 @@ def __init__( - HyperOptSearch raises exception sometimes - TuneBOHB has its own scheduler config_constraints: A list of config constraints to be satisfied. - e.g., - - .. code-block: python - - config_constraints = [(mem_size, '<=', 1024**3)] - - mem_size is a function which produces a float number for the bytes + E.g., ```config_constraints = [(mem_size, '<=', 1024**3)]```. + `mem_size` is a function which produces a float number for the bytes needed for a config. It is used to skip configs which do not fit in memory. metric_constraints: A list of metric constraints to be satisfied. - e.g., `['precision', '>=', 0.9]` + E.g., `['precision', '>=', 0.9]`. seed: An integer of the random seed. experimental: A bool of whether to use experimental features. """ diff --git a/flaml/searcher/flow2.py b/flaml/searcher/flow2.py index b1e69c9b80..88e4c05077 100644 --- a/flaml/searcher/flow2.py +++ b/flaml/searcher/flow2.py @@ -58,14 +58,8 @@ def __init__( minimization or maximization. cat_hp_cost: A dictionary from a subset of categorical dimensions to the relative cost of each choice. - e.g., - - .. code-block:: python - - {'tree_method': [1, 1, 2]} - - i.e., the relative cost of the - three choices of 'tree_method' is 1, 1 and 2 respectively. + E.g., ```{'tree_method': [1, 1, 2]}```. I.e., the relative cost + of the three choices of 'tree_method' is 1, 1 and 2 respectively. space: A dictionary to specify the search space. resource_attr: A string to specify the resource dimension and the best performance is assumed to be at the max_resource. diff --git a/flaml/searcher/online_searcher.py b/flaml/searcher/online_searcher.py index 536c0f2ede..81a98c458a 100644 --- a/flaml/searcher/online_searcher.py +++ b/flaml/searcher/online_searcher.py @@ -46,7 +46,7 @@ class ChampionFrontierSearcher(BaseSearcher): """The ChampionFrontierSearcher class. NOTE about the correspondence about this code and the research paper: - [ChaCha for Online AutoML](https://arxiv.org/pdf/2106.04815.pdf) + [ChaCha for Online AutoML](https://arxiv.org/pdf/2106.04815.pdf). This class serves the role of ConfigOralce as described in the paper. """ diff --git a/flaml/searcher/suggestion.py b/flaml/searcher/suggestion.py index 68ed2fa3f8..95c1d35c16 100644 --- a/flaml/searcher/suggestion.py +++ b/flaml/searcher/suggestion.py @@ -75,21 +75,24 @@ class Searcher: mode (str or list): If string One of {min, max}. If list then list of max and min, determines whether objective is minimizing or maximizing the metric attribute. Must match type of metric. - .. code-block:: python - class ExampleSearch(Searcher): - def __init__(self, metric="mean_loss", mode="min", **kwargs): - super(ExampleSearch, self).__init__( - metric=metric, mode=mode, **kwargs) - self.optimizer = Optimizer() - self.configurations = {} - def suggest(self, trial_id): - configuration = self.optimizer.query() - self.configurations[trial_id] = configuration - def on_trial_complete(self, trial_id, result, **kwargs): - configuration = self.configurations[trial_id] - if result and self.metric in result: - self.optimizer.update(configuration, result[self.metric]) - tune.run(trainable_function, search_alg=ExampleSearch()) + + ```python + class ExampleSearch(Searcher): + def __init__(self, metric="mean_loss", mode="min", **kwargs): + super(ExampleSearch, self).__init__( + metric=metric, mode=mode, **kwargs) + self.optimizer = Optimizer() + self.configurations = {} + def suggest(self, trial_id): + configuration = self.optimizer.query() + self.configurations[trial_id] = configuration + def on_trial_complete(self, trial_id, result, **kwargs): + configuration = self.configurations[trial_id] + if result and self.metric in result: + self.optimizer.update(configuration, result[self.metric]) + tune.run(trainable_function, search_alg=ExampleSearch()) + ``` + """ FINISHED = "FINISHED" @@ -102,7 +105,6 @@ def __init__( max_concurrent: Optional[int] = None, use_early_stopped_trials: Optional[bool] = None, ): - self._metric = metric self._mode = mode @@ -176,11 +178,12 @@ class ConcurrencyLimiter(Searcher): batch (bool): Whether to wait for all concurrent samples to finish before updating the underlying searcher. Example: - .. code-block:: python - from ray.tune.suggest import ConcurrencyLimiter - search_alg = HyperOptSearch(metric="accuracy") - search_alg = ConcurrencyLimiter(search_alg, max_concurrent=2) - tune.run(trainable, search_alg=search_alg) + ```python + from ray.tune.suggest import ConcurrencyLimiter + search_alg = HyperOptSearch(metric="accuracy") + search_alg = ConcurrencyLimiter(search_alg, max_concurrent=2) + tune.run(trainable, search_alg=search_alg) + ``` """ def __init__(self, searcher: Searcher, max_concurrent: int, batch: bool = False): @@ -363,7 +366,8 @@ def __getattr__(self, item_name: str) -> Any: class OptunaSearch(Searcher): """A wrapper around Optuna to provide trial suggestions. - `Optuna `_ is a hyperparameter optimization library. + [Optuna](https://optuna.org/) + is a hyperparameter optimization library. In contrast to other libraries, it employs define-by-run style hyperparameter definitions. This Searcher is a thin wrapper around Optuna's search algorithms. @@ -371,18 +375,17 @@ class OptunaSearch(Searcher): hyperparameter suggestions. Args: space (dict|Callable): Hyperparameter search space definition for - Optuna's sampler. This can be either a :class:`dict` with + Optuna's sampler. This can be either a class `dict` with parameter names as keys and ``optuna.distributions`` as values, or a Callable - in which case, it should be a define-by-run function using ``optuna.trial`` to obtain the hyperparameter - values. The function should return either a :class:`dict` of + values. The function should return either a class `dict` of constant values with names as keys, or None. - For more information, see https://optuna.readthedocs.io\ -/en/stable/tutorial/10_key_features/002_configurations.html. - .. warning:: - No actual computation should take place in the define-by-run - function. Instead, put the training logic inside the function - or class trainable passed to ``tune.run``. + For more information, see + [tutorial](https://optuna.readthedocs.io/en/stable/tutorial/10_key_features/002_configurations.html). + Warning - No actual computation should take place in the define-by-run + function. Instead, put the training logic inside the function + or class trainable passed to tune.run. metric (str): The training result objective value attribute. If None but a mode was passed, the anonymous metric `_metric` will be used per default. @@ -404,43 +407,41 @@ class OptunaSearch(Searcher): as a list so the optimiser can be told the results without needing to re-compute the trial. Must be the same length as points_to_evaluate. + Tune automatically converts search spaces to Optuna's format: - .. code-block:: python - from ray.tune.suggest.optuna import OptunaSearch - config = { - "a": tune.uniform(6, 8) - "b": tune.loguniform(1e-4, 1e-2) - } - optuna_search = OptunaSearch( - metric="loss", - mode="min") - tune.run(trainable, config=config, search_alg=optuna_search) + +````python +from ray.tune.suggest.optuna import OptunaSearch +config = { "a": tune.uniform(6, 8), + "b": tune.loguniform(1e-4, 1e-2)} +optuna_search = OptunaSearch(metric="loss", mode="min") +tune.run(trainable, config=config, search_alg=optuna_search) +```` + If you would like to pass the search space manually, the code would look like this: - .. code-block:: python - from ray.tune.suggest.optuna import OptunaSearch - import optuna - config = { - "a": optuna.distributions.UniformDistribution(6, 8), - "b": optuna.distributions.LogUniformDistribution(1e-4, 1e-2), - } - optuna_search = OptunaSearch( - space, - metric="loss", - mode="min") - tune.run(trainable, search_alg=optuna_search) - # Equivalent Optuna define-by-run function approach: - def define_search_space(trial: optuna.Trial): - trial.suggest_float("a", 6, 8) - trial.suggest_float("b", 1e-4, 1e-2, log=True) - # training logic goes into trainable, this is just - # for search space definition - optuna_search = OptunaSearch( - define_search_space, - metric="loss", - mode="min") - tune.run(trainable, search_alg=optuna_search) - .. versionadded:: 0.8.8 + +```python +from ray.tune.suggest.optuna import OptunaSearch +import optuna +config = { "a": optuna.distributions.UniformDistribution(6, 8), + "b": optuna.distributions.LogUniformDistribution(1e-4, 1e-2)} +optuna_search = OptunaSearch(space,metric="loss",mode="min") +tune.run(trainable, search_alg=optuna_search) +# Equivalent Optuna define-by-run function approach: +def define_search_space(trial: optuna.Trial): + trial.suggest_float("a", 6, 8) + trial.suggest_float("b", 1e-4, 1e-2, log=True) + # training logic goes into trainable, this is just + # for search space definition +optuna_search = OptunaSearch( + define_search_space, + metric="loss", + mode="min") +tune.run(trainable, search_alg=optuna_search) +.. versionadded:: 0.8.8 +``` + """ def __init__( diff --git a/flaml/tune/README.md b/flaml/tune/README.md index a0d5c6a83a..29557e6949 100644 --- a/flaml/tune/README.md +++ b/flaml/tune/README.md @@ -1,7 +1,9 @@ # Economical Hyperparameter Optimization `flaml.tune` is a module for economical hyperparameter tuning. It frees users from manually tuning many hyperparameters for a software, such as machine learning training procedures. -It can be used standalone, or together with ray tune or nni. +It can be used standalone, or together with ray tune or nni. Please find detailed guidelines and use cases about this module in our [documentation website](https://microsoft.github.io/FLAML/docs/Use-Cases/Tune-User-Defined-Function). + +Below are some quick examples. * Example for sequential tuning (recommended when compute resource is limited and each trial can consume all the resources): @@ -116,7 +118,7 @@ $nnictl create --config ./config.yml ## CFO: Frugal Optimization for Cost-related Hyperparameters

- +

@@ -136,7 +138,7 @@ FLOW2 only requires pairwise comparisons between function values to p The GIFs attached below demonstrate an example search trajectory of FLOW2 shown in the loss and evaluation cost (i.e., the training time ) space respectively. From the demonstration, we can see that (1) FLOW2 can quickly move toward the low-loss region, showing good convergence property and (2) FLOW2 tends to avoid exploring the high-cost region until necessary.

- +

Figure 1. FLOW2 in tuning the # of leaves and the # of trees for XGBoost. The two background heatmaps show the loss and cost distribution of all configurations. The black dots are the points evaluated in FLOW2. Black dots connected by lines are points that yield better loss performance when evaluated.

@@ -158,7 +160,7 @@ using BlendSearch. ## BlendSearch: Economical Hyperparameter Optimization With Blended Search Strategy

- +

diff --git a/flaml/tune/trial_runner.py b/flaml/tune/trial_runner.py index 41d34be4ce..3419dc3ec5 100644 --- a/flaml/tune/trial_runner.py +++ b/flaml/tune/trial_runner.py @@ -16,14 +16,14 @@ class Nologger: - """Logger without logging""" + """Logger without logging.""" def on_result(self, result): pass class SimpleTrial(Trial): - """A simple trial class""" + """A simple trial class.""" def __init__(self, config, trial_id=None): self.trial_id = Trial.generate_id() if trial_id is None else trial_id @@ -43,7 +43,7 @@ def __init__(self, config, trial_id=None): class BaseTrialRunner: - """Implementation of a simple trial runner + """Implementation of a simple trial runner. Note that the caller usually should not mutate trial state directly. """ @@ -104,14 +104,16 @@ def stop_trial(self, trial): class SequentialTrialRunner(BaseTrialRunner): - """Implementation of the sequential trial runner""" + """Implementation of the sequential trial runner.""" def step(self) -> Trial: """Runs one step of the trial event loop. + Callers should typically run this method repeatedly in a loop. They may inspect or modify the runner's state in between calls to step(). - returns a Trial to run + Returns: + a trial to run. """ trial_id = Trial.generate_id() config = self._search_alg.suggest(trial_id) diff --git a/flaml/tune/tune.py b/flaml/tune/tune.py index 43ab199124..5a064cfaf0 100644 --- a/flaml/tune/tune.py +++ b/flaml/tune/tune.py @@ -51,27 +51,27 @@ def report(_metric=None, **kwargs): Example: - .. code-block:: python - - import time - from flaml import tune - - def compute_with_config(config): - current_time = time.time() - metric2minimize = (round(config['x'])-95000)**2 - time2eval = time.time() - current_time - tune.report(metric2minimize=metric2minimize, time2eval=time2eval) - - analysis = tune.run( - compute_with_config, - config={ - 'x': tune.lograndint(lower=1, upper=1000000), - 'y': tune.randint(lower=1, upper=1000000) - }, - metric='metric2minimize', mode='min', - num_samples=1000000, time_budget_s=60, use_ray=False) - - print(analysis.trials[-1].last_result) + ```python + import time + from flaml import tune + + def compute_with_config(config): + current_time = time.time() + metric2minimize = (round(config['x'])-95000)**2 + time2eval = time.time() - current_time + tune.report(metric2minimize=metric2minimize, time2eval=time2eval) + + analysis = tune.run( + compute_with_config, + config={ + 'x': tune.lograndint(lower=1, upper=1000000), + 'y': tune.randint(lower=1, upper=1000000) + }, + metric='metric2minimize', mode='min', + num_samples=1000000, time_budget_s=60, use_ray=False) + + print(analysis.trials[-1].last_result) + ``` Args: _metric: Optional default anonymous metric for ``tune.report(value)``. @@ -144,27 +144,27 @@ def run( Example: - .. code-block:: python + ```python + import time + from flaml import tune - import time - from flaml import tune + def compute_with_config(config): + current_time = time.time() + metric2minimize = (round(config['x'])-95000)**2 + time2eval = time.time() - current_time + tune.report(metric2minimize=metric2minimize, time2eval=time2eval) - def compute_with_config(config): - current_time = time.time() - metric2minimize = (round(config['x'])-95000)**2 - time2eval = time.time() - current_time - tune.report(metric2minimize=metric2minimize, time2eval=time2eval) + analysis = tune.run( + compute_with_config, + config={ + 'x': tune.lograndint(lower=1, upper=1000000), + 'y': tune.randint(lower=1, upper=1000000) + }, + metric='metric2minimize', mode='min', + num_samples=-1, time_budget_s=60, use_ray=False) - analysis = tune.run( - compute_with_config, - config={ - 'x': tune.lograndint(lower=1, upper=1000000), - 'y': tune.randint(lower=1, upper=1000000) - }, - metric='metric2minimize', mode='min', - num_samples=-1, time_budget_s=60, use_ray=False) - - print(analysis.trials[-1].last_result) + print(analysis.trials[-1].last_result) + ``` Args: evaluation_function: A user-defined evaluation function. @@ -176,20 +176,11 @@ def compute_with_config(config): config: A dictionary to specify the search space. low_cost_partial_config: A dictionary from a subset of controlled dimensions to the initial low-cost values. - e.g., - - .. code-block:: python - - {'n_estimators': 4, 'max_leaves': 4} + e.g., ```{'n_estimators': 4, 'max_leaves': 4}``` cat_hp_cost: A dictionary from a subset of categorical dimensions to the relative cost of each choice. - e.g., - - .. code-block:: python - - {'tree_method': [1, 1, 2]} - + e.g., ```{'tree_method': [1, 1, 2]}``` i.e., the relative cost of the three choices of 'tree_method' is 1, 1 and 2 respectively metric: A string of the metric name to optimize for. @@ -206,13 +197,13 @@ def compute_with_config(config): points_to_evaluate. e.g., - .. code-block:: python - - points_to_evaluate = [ - {"b": .99, "cost_related": {"a": 3}}, - {"b": .99, "cost_related": {"a": 2}}, - ] - evaluated_rewards=[3.0, 1.0] + ```python + points_to_evaluate = [ + {"b": .99, "cost_related": {"a": 3}}, + {"b": .99, "cost_related": {"a": 2}}, + ] + evaluated_rewards=[3.0, 1.0] + ``` means that you know the reward for the two configs in points_to_evaluate are 3.0 and 1.0 respectively and want to @@ -245,16 +236,16 @@ def compute_with_config(config): to be used. The same instance can be used for iterative tuning. e.g., - .. code-block:: python - - from flaml import BlendSearch - algo = BlendSearch(metric='val_loss', mode='min', - space=search_space, - low_cost_partial_config=low_cost_partial_config) - for i in range(10): - analysis = tune.run(compute_with_config, - search_alg=algo, use_ray=False) - print(analysis.trials[-1].last_result) + ```python + from flaml import BlendSearch + algo = BlendSearch(metric='val_loss', mode='min', + space=search_space, + low_cost_partial_config=low_cost_partial_config) + for i in range(10): + analysis = tune.run(compute_with_config, + search_alg=algo, use_ray=False) + print(analysis.trials[-1].last_result) + ``` verbose: 0, 1, 2, or 3. Verbosity mode for ray if ray backend is used. 0 = silent, 1 = only status updates, 2 = status and brief trial @@ -265,11 +256,7 @@ def compute_with_config(config): resources_per_trial: A dictionary of the hardware resources to allocate per trial, e.g., `{'cpu': 1}`. Only valid when using ray backend. config_constraints: A list of config constraints to be satisfied. - e.g., - - .. code-block: python - - config_constraints = [(mem_size, '<=', 1024**3)] + e.g., ```config_constraints = [(mem_size, '<=', 1024**3)]``` mem_size is a function which produces a float number for the bytes needed for a config. diff --git a/notebook/flaml_automl.ipynb b/notebook/automl_classification.ipynb similarity index 100% rename from notebook/flaml_automl.ipynb rename to notebook/automl_classification.ipynb diff --git a/notebook/flaml_lightgbm.ipynb b/notebook/automl_lightgbm.ipynb similarity index 100% rename from notebook/flaml_lightgbm.ipynb rename to notebook/automl_lightgbm.ipynb diff --git a/notebook/flaml_forecast.ipynb b/notebook/automl_time_series_forecast.ipynb similarity index 100% rename from notebook/flaml_forecast.ipynb rename to notebook/automl_time_series_forecast.ipynb diff --git a/notebook/flaml_xgboost.ipynb b/notebook/automl_xgboost.ipynb similarity index 100% rename from notebook/flaml_xgboost.ipynb rename to notebook/automl_xgboost.ipynb diff --git a/notebook/flaml_autovw.ipynb b/notebook/autovw.ipynb similarity index 99% rename from notebook/flaml_autovw.ipynb rename to notebook/autovw.ipynb index eec560d789..43f359c1e2 100644 --- a/notebook/flaml_autovw.ipynb +++ b/notebook/autovw.ipynb @@ -2,6 +2,11 @@ "cells": [ { "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "Copyright (c) 2020-2021 Microsoft Corporation. All rights reserved. \n", "\n", @@ -18,39 +23,49 @@ "*ChaCha for online AutoML. Qingyun Wu, Chi Wang, John Langford, Paul Mineiro and Marco Rossi. To appear in ICML 2021.*\n", "\n", "AutoVW is implemented in FLAML. FLAML requires `Python>=3.6`. To run this notebook example, please install:" - ], - "metadata": { - "slideshow": { - "slide_type": "slide" - } - } + ] }, { "cell_type": "code", "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!pip install flaml[notebook,vw];" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "## 2. Online regression with AutoVW\n", "### Load data from openml and preprocess\n", "\n", "Download [NewFuelCar](https://www.openml.org/d/41506) from OpenML." - ], - "metadata": { - "slideshow": { - "slide_type": "slide" - } - } + ] }, { "cell_type": "code", "execution_count": 1, + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(36203, 17) (36203,)\n" + ] + } + ], "source": [ "import openml\n", "# did = 42183\n", @@ -60,34 +75,34 @@ "data = ds.get_data(target=target_attribute, dataset_format='array')\n", "X, y = data[0], data[1]\n", "print(X.shape, y.shape)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "(36203, 17) (36203,)\n" - ] - } - ], - "metadata": { - "slideshow": { - "slide_type": "subslide" - }, - "tags": [] - } + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Convert the openml dataset into vowpalwabbit examples:\n", "Sequentially group features into up to 10 namespaces and convert the original data examples into vowpal wabbit format." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openml example: 8.170000076293945 [1.0000e+01 7.0000e+00 3.0000e+00 4.0000e+00 nan 6.3300e+00\n", + " 1.3600e-01 7.3300e+00 7.0100e+00 6.9800e+00 3.0000e-03 7.0000e+00\n", + " 9.7000e+00 1.2300e+01 1.0217e+03 0.0000e+00 5.8000e+01]\n", + "vw example: 8.170000076293945 |a 0:10.000000 1:7.000000|b 2:3.000000 3:4.000000|c 4:nan 5:6.330000|d 6:0.136000 7:7.330000|e 8:7.010000 9:6.980000|f 10:0.003000 11:7.000000|g 12:9.700000 13:12.300000|h 14:1021.700012 15:0.000000|i 16:58.000000\n" + ] + } + ], "source": [ "import numpy as np\n", "import string\n", @@ -113,37 +128,24 @@ " vw_examples.append(ns_line)\n", "print('openml example:', y[0], X[0])\n", "print('vw example:', vw_examples[0])" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "openml example: 8.170000076293945 [1.0000e+01 7.0000e+00 3.0000e+00 4.0000e+00 nan 6.3300e+00\n", - " 1.3600e-01 7.3300e+00 7.0100e+00 6.9800e+00 3.0000e-03 7.0000e+00\n", - " 9.7000e+00 1.2300e+01 1.0217e+03 0.0000e+00 5.8000e+01]\n", - "vw example: 8.170000076293945 |a 0:10.000000 1:7.000000|b 2:3.000000 3:4.000000|c 4:nan 5:6.330000|d 6:0.136000 7:7.330000|e 8:7.010000 9:6.980000|f 10:0.003000 11:7.000000|g 12:9.700000 13:12.300000|h 14:1021.700012 15:0.000000|i 16:58.000000\n" - ] - } - ], - "metadata": { - "tags": [] - } + ] }, { "cell_type": "markdown", - "source": [ - "### Set up the online learning loop\n" - ], "metadata": { "slideshow": { "slide_type": "slide" } - } + }, + "source": [ + "### Set up the online learning loop\n" + ] }, { "cell_type": "code", "execution_count": 4, + "metadata": {}, + "outputs": [], "source": [ "from sklearn.metrics import mean_squared_error\n", "def online_learning_loop(iter_num, vw_examples, vw_alg):\n", @@ -164,72 +166,63 @@ " return loss_list\n", "\n", "max_iter_num = 10000 # or len(vw_examples)" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Vanilla Vowpal Wabbit (VW)\n", "Create and run a vanilla vowpal wabbit learner." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 5, - "source": [ - "from vowpalwabbit import pyvw\n", - "''' create a vanilla vw instance '''\n", - "vanilla_vw = pyvw.vw('--quiet')\n", - "\n", - "# online learning with vanilla VW\n", - "loss_list_vanilla = online_learning_loop(max_iter_num, vw_examples, vanilla_vw)\n", - "print('Final progressive validation loss of vanilla vw:', sum(loss_list_vanilla)/len(loss_list_vanilla))" - ], + "metadata": { + "tags": [] + }, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Online learning for 10000 steps...\n", "Final progressive validation loss of vanilla vw: 15.18087237487917\n" ] } ], - "metadata": { - "tags": [] - } + "source": [ + "from vowpalwabbit import pyvw\n", + "''' create a vanilla vw instance '''\n", + "vanilla_vw = pyvw.vw('--quiet')\n", + "\n", + "# online learning with vanilla VW\n", + "loss_list_vanilla = online_learning_loop(max_iter_num, vw_examples, vanilla_vw)\n", + "print('Final progressive validation loss of vanilla vw:', sum(loss_list_vanilla)/len(loss_list_vanilla))" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### AutoVW which tunes namespace interactions \n", "Create and run an AutoVW instance which tunes namespace interactions. Each AutoVW instance allows ```max_live_model_num``` of VW models (each associated with its own hyperaparameter configurations that are tuned online) to run concurrently in each step of the online learning loop." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 6, - "source": [ - "''' import AutoVW class from flaml package '''\n", - "from flaml import AutoVW\n", - "\n", - "'''create an AutoVW instance for tuning namespace interactions'''\n", - "# configure both hyperparamters to tune, e.g., 'interactions', and fixed arguments about the online learner,\n", - "# e.g., 'quiet' in the search_space argument.\n", - "autovw_ni = AutoVW(max_live_model_num=5, search_space={'interactions': AutoVW.AUTOMATIC, 'quiet': ''})\n", - "\n", - "# online learning with AutoVW\n", - "loss_list_autovw_ni = online_learning_loop(max_iter_num, vw_examples, autovw_ni)\n", - "print('Final progressive validation loss of autovw:', sum(loss_list_autovw_ni)/len(loss_list_autovw_ni))" - ], + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "outputs": [ { - "output_type": "stream", "name": "stderr", + "output_type": "stream", "text": [ "Seed namespaces (singletons and interactions): ['g', 'a', 'h', 'b', 'c', 'i', 'd', 'e', 'f']\n", "Created challengers from champion ||\n", @@ -242,26 +235,49 @@ ] } ], - "metadata": { - "slideshow": { - "slide_type": "slide" - }, - "tags": [] - } + "source": [ + "''' import AutoVW class from flaml package '''\n", + "from flaml import AutoVW\n", + "\n", + "'''create an AutoVW instance for tuning namespace interactions'''\n", + "# configure both hyperparamters to tune, e.g., 'interactions', and fixed arguments about the online learner,\n", + "# e.g., 'quiet' in the search_space argument.\n", + "autovw_ni = AutoVW(max_live_model_num=5, search_space={'interactions': AutoVW.AUTOMATIC, 'quiet': ''})\n", + "\n", + "# online learning with AutoVW\n", + "loss_list_autovw_ni = online_learning_loop(max_iter_num, vw_examples, autovw_ni)\n", + "print('Final progressive validation loss of autovw:', sum(loss_list_autovw_ni)/len(loss_list_autovw_ni))" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Online performance comparison between vanilla VW and AutoVW" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "import matplotlib.pyplot as plt\n", - "def plot_progressive_loss(obj_list, alias, result_interval=1,):\n", + "def plot_progressive_loss(obj_list, alias, result_interval=1):\n", " \"\"\"Show real-time progressive validation loss\n", " \"\"\"\n", " avg_list = [sum(obj_list[:i]) / i for i in range(1, len(obj_list))]\n", @@ -276,52 +292,26 @@ "plot_progressive_loss(loss_list_vanilla, 'VanillaVW')\n", "plot_progressive_loss(loss_list_autovw_ni, 'AutoVW:NI')\n", "plt.show()" - ], - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### AutoVW which tunes both namespace interactions and learning rate\n", "Create and run an AutoVW instance which tunes both namespace interactions and learning rate." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 8, - "source": [ - "from flaml.tune import loguniform\n", - "''' create another AutoVW instance for tuning namespace interactions and learning rate'''\n", - "# set up the search space and init config\n", - "search_space_nilr = {'interactions': AutoVW.AUTOMATIC, 'learning_rate': loguniform(lower=2e-10, upper=1.0), 'quiet': ''}\n", - "init_config_nilr = {'interactions': set(), 'learning_rate': 0.5}\n", - "# create an AutoVW instance\n", - "autovw_nilr = AutoVW(max_live_model_num=5, search_space=search_space_nilr, init_config=init_config_nilr)\n", - "\n", - "# online learning with AutoVW\n", - "loss_list_autovw_nilr = online_learning_loop(max_iter_num, vw_examples, autovw_nilr)\n", - "print('Final progressive validation loss of autovw_nilr:', sum(loss_list_autovw_nilr)/len(loss_list_autovw_nilr))\n" - ], + "metadata": { + "tags": [] + }, "outputs": [ { - "output_type": "stream", "name": "stderr", + "output_type": "stream", "text": [ "Seed namespaces (singletons and interactions): ['g', 'a', 'h', 'b', 'c', 'i', 'd', 'e', 'f']\n", "No low-cost partial config given to the search algorithm. For cost-frugal search, consider providing low-cost values for cost-related hps via 'low_cost_partial_config'.\n", @@ -336,73 +326,75 @@ ] } ], - "metadata": { - "tags": [] - } + "source": [ + "from flaml.tune import loguniform\n", + "''' create another AutoVW instance for tuning namespace interactions and learning rate'''\n", + "# set up the search space and init config\n", + "search_space_nilr = {'interactions': AutoVW.AUTOMATIC, 'learning_rate': loguniform(lower=2e-10, upper=1.0), 'quiet': ''}\n", + "init_config_nilr = {'interactions': set(), 'learning_rate': 0.5}\n", + "# create an AutoVW instance\n", + "autovw_nilr = AutoVW(max_live_model_num=5, search_space=search_space_nilr, init_config=init_config_nilr)\n", + "\n", + "# online learning with AutoVW\n", + "loss_list_autovw_nilr = online_learning_loop(max_iter_num, vw_examples, autovw_nilr)\n", + "print('Final progressive validation loss of autovw_nilr:', sum(loss_list_autovw_nilr)/len(loss_list_autovw_nilr))\n" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Online performance comparison between vanilla VW and two AutoVW instances\n", "Compare the online progressive validation loss from the vanilla VW and two AutoVW instances." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 10, - "source": [ - "plt.figure(figsize=(8, 6))\n", - "plot_progressive_loss(loss_list_vanilla, 'VanillaVW')\n", - "plot_progressive_loss(loss_list_autovw_ni, 'AutoVW:NI')\n", - "plot_progressive_loss(loss_list_autovw_nilr, 'AutoVW:NI+LR')\n", - "plt.show()" - ], + "metadata": { + "tags": [] + }, "outputs": [ { - "output_type": "display_data", "data": { + "image/png": "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", + "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" - ], - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } ], - "metadata": { - "tags": [] - } + "source": [ + "plt.figure(figsize=(8, 6))\n", + "plot_progressive_loss(loss_list_vanilla, 'VanillaVW')\n", + "plot_progressive_loss(loss_list_autovw_ni, 'AutoVW:NI')\n", + "plot_progressive_loss(loss_list_autovw_nilr, 'AutoVW:NI+LR')\n", + "plt.show()" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### AutoVW based on customized VW arguments\n", "You can easily create an AutoVW instance based on customized VW arguments (For now only arguments that are compatible with supervised regression task are well supported). The customized arguments can be passed to AutoVW through init_config and search space." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 11, - "source": [ - "''' create an AutoVW instance with ustomized VW arguments'''\n", - "# parse the customized VW arguments\n", - "fixed_vw_hp_config = {'alg': 'supervised', 'loss_function': 'classic', 'quiet': ''}\n", - "search_space = fixed_vw_hp_config.copy()\n", - "search_space.update({'interactions': AutoVW.AUTOMATIC,})\n", - "\n", - "autovw_custom = AutoVW(max_live_model_num=5, search_space=search_space) \n", - "loss_list_custom = online_learning_loop(max_iter_num, vw_examples, autovw_custom)\n", - "print('Average final loss of the AutoVW (tuning namespaces) based on customized vw arguments:', sum(loss_list_custom)/len(loss_list_custom))\n" - ], + "metadata": { + "tags": [] + }, "outputs": [ { - "output_type": "stream", "name": "stderr", + "output_type": "stream", "text": [ "Seed namespaces (singletons and interactions): ['g', 'a', 'h', 'b', 'c', 'i', 'd', 'e', 'f']\n", "Created challengers from champion |supervised||classic|\n", @@ -415,22 +407,33 @@ ] } ], - "metadata": { - "tags": [] - } + "source": [ + "''' create an AutoVW instance with ustomized VW arguments'''\n", + "# parse the customized VW arguments\n", + "fixed_vw_hp_config = {'alg': 'supervised', 'loss_function': 'classic', 'quiet': ''}\n", + "search_space = fixed_vw_hp_config.copy()\n", + "search_space.update({'interactions': AutoVW.AUTOMATIC,})\n", + "\n", + "autovw_custom = AutoVW(max_live_model_num=5, search_space=search_space) \n", + "loss_list_custom = online_learning_loop(max_iter_num, vw_examples, autovw_custom)\n", + "print('Average final loss of the AutoVW (tuning namespaces) based on customized vw arguments:', sum(loss_list_custom)/len(loss_list_custom))\n" + ] }, { "cell_type": "code", "execution_count": null, - "source": [], + "metadata": {}, "outputs": [], - "metadata": {} + "source": [] } ], "metadata": { + "interpreter": { + "hash": "4502d015faca2560a557f35a41b6dd402f7fdfc08e843ae17a9c41947939f10c" + }, "kernelspec": { - "name": "python3", - "display_name": "Python 3.8.10 64-bit ('py38': conda)" + "display_name": "Python 3.8.10 64-bit ('py38': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -443,11 +446,8 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "interpreter": { - "hash": "4502d015faca2560a557f35a41b6dd402f7fdfc08e843ae17a9c41947939f10c" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/notebook/flaml_azureml.ipynb b/notebook/integrate_azureml.ipynb similarity index 100% rename from notebook/flaml_azureml.ipynb rename to notebook/integrate_azureml.ipynb diff --git a/notebook/automl_in_sklearn_pipeline.ipynb b/notebook/integrate_sklearn.ipynb similarity index 100% rename from notebook/automl_in_sklearn_pipeline.ipynb rename to notebook/integrate_sklearn.ipynb diff --git a/notebook/flaml_finetune_transformer.ipynb b/notebook/tune_huggingface.ipynb similarity index 100% rename from notebook/flaml_finetune_transformer.ipynb rename to notebook/tune_huggingface.ipynb diff --git a/notebook/flaml_pytorch_cifar10.ipynb b/notebook/tune_pytorch.ipynb similarity index 100% rename from notebook/flaml_pytorch_cifar10.ipynb rename to notebook/tune_pytorch.ipynb diff --git a/setup.py b/setup.py index 8515bade5a..0ea3c50a68 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ version=__version__, author="Microsoft Corporation", author_email="hpo@microsoft.com", - description="A fast and lightweight autoML system", + description="A fast library for automated machine learning and tuning", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/microsoft/FLAML", diff --git a/test/.Docker/Dockerfile-cpu b/test/.Docker/Dockerfile-cpu new file mode 100644 index 0000000000..3c450b9351 --- /dev/null +++ b/test/.Docker/Dockerfile-cpu @@ -0,0 +1,14 @@ +FROM python:3.7 + +RUN pip install azureml-core +RUN pip install flaml[blendsearch,ray] + + +EXPOSE 8265 +EXPOSE 6379 + +USER root + +RUN apt-get update +RUN apt-get install -y jq +RUN apt-get install -y rsync diff --git a/test/automl/test_split.py b/test/automl/test_split.py index 3a81ad3e36..be18e44f2c 100644 --- a/test/automl/test_split.py +++ b/test/automl/test_split.py @@ -1,5 +1,3 @@ -import unittest - from sklearn.datasets import fetch_openml from flaml.automl import AutoML from sklearn.model_selection import train_test_split, KFold @@ -88,11 +86,11 @@ def test_rank(): try: X, y = fetch_openml(name=dataset, return_X_y=True) + y = y.cat.codes except (ArffException, ValueError): from sklearn.datasets import load_wine X, y = load_wine(return_X_y=True) - y = y.cat.codes import numpy as np automl = AutoML() @@ -163,5 +161,4 @@ def get_n_splits(self, X=None, y=None, groups=None): if __name__ == "__main__": - # unittest.main() test_groups() diff --git a/test/rank.py b/test/rank.py new file mode 100644 index 0000000000..4d3f8258f7 --- /dev/null +++ b/test/rank.py @@ -0,0 +1,14 @@ +from sklearn.datasets import fetch_openml +from flaml import AutoML + +X_train, y_train = fetch_openml(name="credit-g", return_X_y=True, as_frame=False) +# not a real learning to rank dataaset +groups = [200] * 4 + [100] * 2 # group counts +automl = AutoML() +automl.fit( + X_train, + y_train, + groups=groups, + task="rank", + time_budget=1, # in seconds +) diff --git a/test/ray/automl.py b/test/ray/automl.py new file mode 100644 index 0000000000..c9d6c24be9 --- /dev/null +++ b/test/ray/automl.py @@ -0,0 +1,15 @@ +from flaml import AutoML + + +def _test_ray_classification(): + from sklearn.datasets import make_classification + import ray + + ray.init(address="auto") + X, y = make_classification(1000, 10) + automl = AutoML() + automl.fit(X, y, time_budget=10, task="classification", n_concurrent_trials=2) + + +if __name__ == "__main__": + _test_ray_classification() diff --git a/test/reg.py b/test/reg.py new file mode 100644 index 0000000000..f78b66ffee --- /dev/null +++ b/test/reg.py @@ -0,0 +1,27 @@ +from flaml import AutoML +from sklearn.datasets import fetch_california_housing + +# Initialize an AutoML instance +automl = AutoML() +# Specify automl goal and constraint +automl_settings = { + "time_budget": 1, # in seconds + "metric": "r2", + "task": "regression", + "log_file_name": "test/california.log", +} +X_train, y_train = fetch_california_housing(return_X_y=True) +# Train with labeled input data +automl.fit(X_train=X_train, y_train=y_train, **automl_settings) +print(automl.model) +print(automl.model.estimator) + +print(automl.best_estimator) +print(automl.best_config) +print(automl.best_config_per_estimator) + +print(automl.best_config_train_time) +print(automl.best_iteration) +print(automl.best_loss) +print(automl.time_to_find_best_model) +print(automl.config_history) diff --git a/test/run_flaml.py b/test/run_flaml.py new file mode 100644 index 0000000000..fb6bc23367 --- /dev/null +++ b/test/run_flaml.py @@ -0,0 +1,37 @@ +import time +from azureml.core import Workspace, Experiment, ScriptRunConfig, Environment + +ws = Workspace.from_config() +ray_environment_name = "aml-ray-cpu" +ray_environment_dockerfile_path = "./Docker/Dockerfile-cpu" + +# Build CPU image for Ray +ray_cpu_env = Environment.from_dockerfile( + name=ray_environment_name, dockerfile=ray_environment_dockerfile_path +) +ray_cpu_env.register(workspace=ws) +ray_cpu_build_details = ray_cpu_env.build(workspace=ws) + +while ray_cpu_build_details.status not in ["Succeeded", "Failed"]: + print( + f"Awaiting completion of ray CPU environment build. Current status is: {ray_cpu_build_details.status}" + ) + time.sleep(10) + +env = Environment.get(workspace=ws, name=ray_environment_name) +compute_target = ws.compute_targets["cpucluster"] +command = ["python automl.py"] +config = ScriptRunConfig( + source_directory="ray/", + command=command, + compute_target=compute_target, + environment=env, +) +config.run_config.node_count = 2 +config.run_config.environment_variables["_AZUREML_CR_START_RAY"] = "true" +config.run_config.environment_variables["AZUREML_COMPUTE_USE_COMMON_RUNTIME"] = "true" + +exp = Experiment(ws, "test-ray") +run = exp.submit(config) +print(run.get_portal_url()) # link to ml.azure.com +run.wait_for_completion(show_output=True) diff --git a/test/tune.py b/test/tune.py new file mode 100644 index 0000000000..a14dd61286 --- /dev/null +++ b/test/tune.py @@ -0,0 +1,49 @@ +from flaml import tune +from flaml.model import LGBMEstimator +import lightgbm +from sklearn.model_selection import train_test_split +from sklearn.datasets import fetch_california_housing +from sklearn.metrics import mean_squared_error + +X, y = fetch_california_housing(return_X_y=True) +X_train, X_test, y_train, y_test = train_test_split( + X, y, test_size=0.33, random_state=42 +) + + +def train_lgbm(config: dict) -> dict: + # convert config dict to lgbm params + params = LGBMEstimator(**config).params + num_boost_round = params.pop("n_estimators") + # train the model + train_set = lightgbm.Dataset(X_train, y_train) + model = lightgbm.train(params, train_set, num_boost_round) + # evaluate the model + pred = model.predict(X_test) + mse = mean_squared_error(y_test, pred) + # return eval results as a dictionary + return {"mse": mse} + + +# load a built-in search space from flaml +flaml_lgbm_search_space = LGBMEstimator.search_space(X_train.shape) +# specify the search space as a dict from hp name to domain; you can define your own search space same way +config_search_space = { + hp: space["domain"] for hp, space in flaml_lgbm_search_space.items() +} +# give guidance about hp values corresponding to low training cost, i.e., {"n_estimators": 4, "num_leaves": 4} +low_cost_partial_config = { + hp: space["low_cost_init_value"] + for hp, space in flaml_lgbm_search_space.items() + if "low_cost_init_value" in space +} +# run the tuning, minimizing mse, with total time budget 3 seconds +analysis = tune.run( + train_lgbm, + metric="mse", + mode="min", + config=config_search_space, + low_cost_partial_config=low_cost_partial_config, + time_budget_s=3, + num_samples=-1, +) diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000000..b88fd58714 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,22 @@ +# Dependencies +/node_modules +package-lock.json + +# Production +/build + +# Generated files +.docusaurus +.cache-loader +docs/reference + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000000..a931c90243 --- /dev/null +++ b/website/README.md @@ -0,0 +1,31 @@ +# Website + +This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. + +## Prerequisites + +To build and test documentation locally, begin by downloading and installing [Node.js](https://nodejs.org/en/download/), and then installing [Yarn](https://classic.yarnpkg.com/en/). +On Windows, you can install via the npm package manager (npm) which comes bundled with Node.js: + +```console +npm install --global yarn +``` + +## Installation + +```console +pip install pydoc-markdown +cd website +yarn install +``` + +## Local Development + +Navigate to the website folder and run: + +```console +pydoc-markdown +yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. diff --git a/website/babel.config.js b/website/babel.config.js new file mode 100644 index 0000000000..e00595dae7 --- /dev/null +++ b/website/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/website/blog/.gitkeep b/website/blog/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/website/docs/Contribute.md b/website/docs/Contribute.md new file mode 100644 index 0000000000..0ba46c0353 --- /dev/null +++ b/website/docs/Contribute.md @@ -0,0 +1,88 @@ +# Contributing + +This project welcomes (and encourages) all forms of contributions, including but not limited to: +- Pushing patches. +- Code review of pull requests. +- Documentation, examples and test cases. +- Readability improvement, e.g., improvement on docstr and comments. +- Community participation in [issues](https://github.com/microsoft/FLAML/issues), [discussions](https://github.com/microsoft/FLAML/discussions), and [gitter](https://gitter.im/FLAMLer/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge). +- Tutorials, blog posts, talks that promote the project. +- Sharing application scenarios and/or related research. + +You can take a look at the [Roadmap for Upcoming Features](https://github.com/microsoft/FLAML/wiki/Roadmap-for-Upcoming-Features) to identify potential things to work on. + + +Most contributions require you to agree to a +Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us +the rights to use your contribution. For details, visit . + +If you are new to GitHub [here](https://help.github.com/categories/collaborating-with-issues-and-pull-requests/) is a detailed help source on getting involved with development on GitHub. + +When you submit a pull request, a CLA bot will automatically determine whether you need to provide +a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions +provided by the bot. You will only need to do this once across all repos using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Becoming a Reviewer +There is currently no formal reviewer solicitation process. Current reviewers identify reviewers from active contributors. If you are willing to become a reviewer, you are welcome to let us know on gitter. + +## Developing + +### Setup + +```bash +git clone https://github.com/microsoft/FLAML.git +pip install -e .[test,notebook] +``` + +### Docker + +We provide a simple [Dockerfile](https://github.com/microsoft/FLAML/blob/main/Dockerfile). + +```bash +docker build git://github.com/microsoft/FLAML -t flaml-dev +docker run -it flaml-dev +``` + +### Develop in Remote Container + +If you use vscode, you can open the FLAML folder in a [Container](https://code.visualstudio.com/docs/remote/containers). +We have provided the configuration in [devcontainer](https://github.com/microsoft/FLAML/blob/main/.devcontainer). + +### Pre-commit + +Run `pre-commit install` to install pre-commit into your git hooks. Before you commit, run +`pre-commit run` to check if you meet the pre-commit requirements. If you use Windows (without WSL) and can't commit after installing pre-commit, you can run `pre-commit uninstall` to uninstall the hook. In WSL or Linux this is supposed to work. + +### Coverage + +Any code you commit should not decrease coverage. To run all unit tests: + +```bash +coverage run -m pytest test +``` + +Then you can see the coverage report by +`coverage report -m` or `coverage html`. +If all the tests are passed, please also test run [notebook/automl_classification](https://github.com/microsoft/FLAML/blob/main/notebook/automl_classification.ipynb) to make sure your commit does not break the notebook example. + +### Documentation + +To build and test documentation locally, install [Node.js](https://nodejs.org/en/download/). + +Then: + +```console +npm install --global yarn +pip install pydoc-markdown +cd website +yarn install +pydoc-markdown +yarn start +``` + +The last command starts a local development server and opens up a browser window. +Most changes are reflected live without having to restart the server. diff --git a/website/docs/Examples/AutoML-Classification.md b/website/docs/Examples/AutoML-Classification.md new file mode 100644 index 0000000000..2378989645 --- /dev/null +++ b/website/docs/Examples/AutoML-Classification.md @@ -0,0 +1,62 @@ +# AutoML - Classification + +### A basic classification example + +```python +from flaml import AutoML +from sklearn.datasets import load_iris + +# Initialize an AutoML instance +automl = AutoML() +# Specify automl goal and constraint +automl_settings = { + "time_budget": 1, # in seconds + "metric": 'accuracy', + "task": 'classification', + "log_file_name": "iris.log", +} +X_train, y_train = load_iris(return_X_y=True) +# Train with labeled input data +automl.fit(X_train=X_train, y_train=y_train, + **automl_settings) +# Predict +print(automl.predict_proba(X_train)) +# Print the best model +print(automl.model.estimator) +``` + +#### Sample of output +``` +[flaml.automl: 11-12 18:21:44] {1485} INFO - Data split method: stratified +[flaml.automl: 11-12 18:21:44] {1489} INFO - Evaluation method: cv +[flaml.automl: 11-12 18:21:44] {1540} INFO - Minimizing error metric: 1-accuracy +[flaml.automl: 11-12 18:21:44] {1577} INFO - List of ML learners in AutoML Run: ['lgbm', 'rf', 'catboost', 'xgboost', 'extra_tree', 'lrl1'] +[flaml.automl: 11-12 18:21:44] {1826} INFO - iteration 0, current learner lgbm +[flaml.automl: 11-12 18:21:44] {1944} INFO - Estimated sufficient time budget=1285s. Estimated necessary time budget=23s. +[flaml.automl: 11-12 18:21:44] {2029} INFO - at 0.2s, estimator lgbm's best error=0.0733, best estimator lgbm's best error=0.0733 +[flaml.automl: 11-12 18:21:44] {1826} INFO - iteration 1, current learner lgbm +[flaml.automl: 11-12 18:21:44] {2029} INFO - at 0.3s, estimator lgbm's best error=0.0733, best estimator lgbm's best error=0.0733 +[flaml.automl: 11-12 18:21:44] {1826} INFO - iteration 2, current learner lgbm +[flaml.automl: 11-12 18:21:44] {2029} INFO - at 0.4s, estimator lgbm's best error=0.0533, best estimator lgbm's best error=0.0533 +[flaml.automl: 11-12 18:21:44] {1826} INFO - iteration 3, current learner lgbm +[flaml.automl: 11-12 18:21:44] {2029} INFO - at 0.6s, estimator lgbm's best error=0.0533, best estimator lgbm's best error=0.0533 +[flaml.automl: 11-12 18:21:44] {1826} INFO - iteration 4, current learner lgbm +[flaml.automl: 11-12 18:21:44] {2029} INFO - at 0.6s, estimator lgbm's best error=0.0533, best estimator lgbm's best error=0.0533 +[flaml.automl: 11-12 18:21:44] {1826} INFO - iteration 5, current learner xgboost +[flaml.automl: 11-12 18:21:45] {2029} INFO - at 0.9s, estimator xgboost's best error=0.0600, best estimator lgbm's best error=0.0533 +[flaml.automl: 11-12 18:21:45] {1826} INFO - iteration 6, current learner lgbm +[flaml.automl: 11-12 18:21:45] {2029} INFO - at 1.0s, estimator lgbm's best error=0.0533, best estimator lgbm's best error=0.0533 +[flaml.automl: 11-12 18:21:45] {1826} INFO - iteration 7, current learner extra_tree +[flaml.automl: 11-12 18:21:45] {2029} INFO - at 1.1s, estimator extra_tree's best error=0.0667, best estimator lgbm's best error=0.0533 +[flaml.automl: 11-12 18:21:45] {2242} INFO - retrain lgbm for 0.0s +[flaml.automl: 11-12 18:21:45] {2247} INFO - retrained model: LGBMClassifier(learning_rate=0.2677050123105203, max_bin=127, + min_child_samples=12, n_estimators=4, num_leaves=4, + reg_alpha=0.001348364934537134, reg_lambda=1.4442580148221913, + verbose=-1) +[flaml.automl: 11-12 18:21:45] {1608} INFO - fit succeeded +[flaml.automl: 11-12 18:21:45] {1610} INFO - Time taken to find the best model: 0.3756711483001709 +``` + +### A more advanced example including custom learner and metric + +[Link to notebook](https://github.com/microsoft/FLAML/blob/main/notebook/flaml_automl.ipynb) | [Open in colab](https://colab.research.google.com/github/microsoft/FLAML/blob/main/notebook/flaml_automl.ipynb) \ No newline at end of file diff --git a/website/docs/Examples/AutoML-NLP.md b/website/docs/Examples/AutoML-NLP.md new file mode 100644 index 0000000000..2490c8a752 --- /dev/null +++ b/website/docs/Examples/AutoML-NLP.md @@ -0,0 +1,89 @@ +# AutoML - NLP + +### Requirements + +This example requires GPU. Install the [nlp] option: +```python +pip install "flaml[nlp]" +``` + +### A simple sequence classification example + +```python +from flaml import AutoML +from datasets import load_dataset + +train_dataset = load_dataset("glue", "mrpc", split="train").to_pandas() +dev_dataset = load_dataset("glue", "mrpc", split="validation").to_pandas() +test_dataset = load_dataset("glue", "mrpc", split="test").to_pandas() +custom_sent_keys = ["sentence1", "sentence2"] +label_key = "label" +X_train, y_train = train_dataset[custom_sent_keys], train_dataset[label_key] +X_val, y_val = dev_dataset[custom_sent_keys], dev_dataset[label_key] +X_test = test_dataset[custom_sent_keys] + +automl = AutoML() +automl_settings = { + "time_budget": 100, + "task": "seq-classification", + "custom_hpo_args": {"output_dir": "data/output/"}, + "gpu_per_trial": 1, # set to 0 if no GPU is available +} +automl.fit(X_train=X_train, y_train=y_train, X_val=X_val, y_val=y_val, **automl_settings) +automl.predict(X_test) +``` + +#### Sample output + +``` +[flaml.automl: 12-06 08:21:39] {1943} INFO - task = seq-classification +[flaml.automl: 12-06 08:21:39] {1945} INFO - Data split method: stratified +[flaml.automl: 12-06 08:21:39] {1949} INFO - Evaluation method: holdout +[flaml.automl: 12-06 08:21:39] {2019} INFO - Minimizing error metric: 1-accuracy +[flaml.automl: 12-06 08:21:39] {2071} INFO - List of ML learners in AutoML Run: ['transformer'] +[flaml.automl: 12-06 08:21:39] {2311} INFO - iteration 0, current learner transformer +{'data/output/train_2021-12-06_08-21-53/train_8947b1b2_1_n=1e-06,s=9223372036854775807,e=1e-05,s=-1,s=0.45765,e=32,d=42,o=0.0,y=0.0_2021-12-06_08-21-53/checkpoint-53': 53} +[flaml.automl: 12-06 08:22:56] {2424} INFO - Estimated sufficient time budget=766860s. Estimated necessary time budget=767s. +[flaml.automl: 12-06 08:22:56] {2499} INFO - at 76.7s, estimator transformer's best error=0.1740, best estimator transformer's best error=0.1740 +[flaml.automl: 12-06 08:22:56] {2606} INFO - selected model: +[flaml.automl: 12-06 08:22:56] {2100} INFO - fit succeeded +[flaml.automl: 12-06 08:22:56] {2101} INFO - Time taken to find the best model: 76.69802761077881 +[flaml.automl: 12-06 08:22:56] {2112} WARNING - Time taken to find the best model is 77% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget. +``` + +### A simple sequence regression example + +```python +from flaml import AutoML +from datasets import load_dataset + +train_dataset = ( + load_dataset("glue", "stsb", split="train[:1%]").to_pandas().iloc[0:4] +) +dev_dataset = ( + load_dataset("glue", "stsb", split="train[1%:2%]").to_pandas().iloc[0:4] +) +custom_sent_keys = ["sentence1", "sentence2"] +label_key = "label" +X_train = train_dataset[custom_sent_keys] +y_train = train_dataset[label_key] +X_val = dev_dataset[custom_sent_keys] +y_val = dev_dataset[label_key] + +automl = AutoML() +automl_settings = { + "gpu_per_trial": 0, + "time_budget": 20, + "task": "seq-regression", + "metric": "rmse", +} +automl_settings["custom_hpo_args"] = { + "model_path": "google/electra-small-discriminator", + "output_dir": "data/output/", + "ckpt_per_epoch": 5, + "fp16": False, +} +automl.fit( + X_train=X_train, y_train=y_train, X_val=X_val, y_val=y_val, **automl_settings +) +``` \ No newline at end of file diff --git a/website/docs/Examples/AutoML-Rank.md b/website/docs/Examples/AutoML-Rank.md new file mode 100644 index 0000000000..a145f225e3 --- /dev/null +++ b/website/docs/Examples/AutoML-Rank.md @@ -0,0 +1,96 @@ +# AutoML - Rank + +### A simple learning-to-rank example + +```python +from sklearn.datasets import fetch_openml +from flaml import AutoML + +X_train, y_train = fetch_openml(name="credit-g", return_X_y=True, as_frame=False) +y_train = y_train.cat.codes +# not a real learning to rank dataaset +groups = [200] * 4 + [100] * 2 # group counts +automl = AutoML() +automl.fit( + X_train, y_train, groups=groups, + task='rank', time_budget=10, # in seconds +) +``` + +#### Sample output + +``` +[flaml.automl: 11-15 07:14:30] {1485} INFO - Data split method: group +[flaml.automl: 11-15 07:14:30] {1489} INFO - Evaluation method: holdout +[flaml.automl: 11-15 07:14:30] {1540} INFO - Minimizing error metric: 1-ndcg +[flaml.automl: 11-15 07:14:30] {1577} INFO - List of ML learners in AutoML Run: ['lgbm', 'xgboost'] +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 0, current learner lgbm +[flaml.automl: 11-15 07:14:30] {1944} INFO - Estimated sufficient time budget=679s. Estimated necessary time budget=1s. +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.1s, estimator lgbm's best error=0.0248, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 1, current learner lgbm +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.1s, estimator lgbm's best error=0.0248, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 2, current learner lgbm +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.2s, estimator lgbm's best error=0.0248, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 3, current learner lgbm +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.2s, estimator lgbm's best error=0.0248, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 4, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.2s, estimator xgboost's best error=0.0315, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 5, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.2s, estimator xgboost's best error=0.0315, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 6, current learner lgbm +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.3s, estimator lgbm's best error=0.0248, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 7, current learner lgbm +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.3s, estimator lgbm's best error=0.0248, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 8, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.4s, estimator xgboost's best error=0.0315, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 9, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.4s, estimator xgboost's best error=0.0315, best estimator lgbm's best error=0.0248 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 10, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.4s, estimator xgboost's best error=0.0233, best estimator xgboost's best error=0.0233 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 11, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.4s, estimator xgboost's best error=0.0233, best estimator xgboost's best error=0.0233 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 12, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.4s, estimator xgboost's best error=0.0233, best estimator xgboost's best error=0.0233 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 13, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.4s, estimator xgboost's best error=0.0233, best estimator xgboost's best error=0.0233 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 14, current learner lgbm +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.5s, estimator lgbm's best error=0.0225, best estimator lgbm's best error=0.0225 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 15, current learner xgboost +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.5s, estimator xgboost's best error=0.0233, best estimator lgbm's best error=0.0225 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 16, current learner lgbm +[flaml.automl: 11-15 07:14:30] {2029} INFO - at 0.5s, estimator lgbm's best error=0.0225, best estimator lgbm's best error=0.0225 +[flaml.automl: 11-15 07:14:30] {1826} INFO - iteration 17, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.5s, estimator lgbm's best error=0.0225, best estimator lgbm's best error=0.0225 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 18, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.6s, estimator lgbm's best error=0.0225, best estimator lgbm's best error=0.0225 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 19, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.6s, estimator lgbm's best error=0.0201, best estimator lgbm's best error=0.0201 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 20, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.6s, estimator lgbm's best error=0.0201, best estimator lgbm's best error=0.0201 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 21, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.7s, estimator lgbm's best error=0.0201, best estimator lgbm's best error=0.0201 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 22, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.7s, estimator lgbm's best error=0.0201, best estimator lgbm's best error=0.0201 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 23, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.8s, estimator lgbm's best error=0.0201, best estimator lgbm's best error=0.0201 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 24, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.8s, estimator lgbm's best error=0.0201, best estimator lgbm's best error=0.0201 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 25, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.8s, estimator lgbm's best error=0.0201, best estimator lgbm's best error=0.0201 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 26, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.9s, estimator lgbm's best error=0.0197, best estimator lgbm's best error=0.0197 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 27, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 0.9s, estimator lgbm's best error=0.0197, best estimator lgbm's best error=0.0197 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 28, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 1.0s, estimator lgbm's best error=0.0197, best estimator lgbm's best error=0.0197 +[flaml.automl: 11-15 07:14:31] {1826} INFO - iteration 29, current learner lgbm +[flaml.automl: 11-15 07:14:31] {2029} INFO - at 1.0s, estimator lgbm's best error=0.0197, best estimator lgbm's best error=0.0197 +[flaml.automl: 11-15 07:14:31] {2242} INFO - retrain lgbm for 0.0s +[flaml.automl: 11-15 07:14:31] {2247} INFO - retrained model: LGBMRanker(colsample_bytree=0.9852774042640857, + learning_rate=0.034918421933217675, max_bin=1023, + min_child_samples=22, n_estimators=6, num_leaves=23, + reg_alpha=0.0009765625, reg_lambda=21.505295697527654, verbose=-1) +[flaml.automl: 11-15 07:14:31] {1608} INFO - fit succeeded +[flaml.automl: 11-15 07:14:31] {1610} INFO - Time taken to find the best model: 0.8846545219421387 +[flaml.automl: 11-15 07:14:31] {1624} WARNING - Time taken to find the best model is 88% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget. +``` \ No newline at end of file diff --git a/website/docs/Examples/AutoML-Regression.md b/website/docs/Examples/AutoML-Regression.md new file mode 100644 index 0000000000..1c2032958d --- /dev/null +++ b/website/docs/Examples/AutoML-Regression.md @@ -0,0 +1,101 @@ +# AutoML - Regression + +### A basic regression example + +```python +from flaml import AutoML +from sklearn.datasets import fetch_california_housing + +# Initialize an AutoML instance +automl = AutoML() +# Specify automl goal and constraint +automl_settings = { + "time_budget": 1, # in seconds + "metric": 'r2', + "task": 'regression', + "log_file_name": "california.log", +} +X_train, y_train = fetch_california_housing(return_X_y=True) +# Train with labeled input data +automl.fit(X_train=X_train, y_train=y_train, + **automl_settings) +# Predict +print(automl.predict(X_train)) +# Print the best model +print(automl.model.estimator) +``` + +#### Sample output + +``` +[flaml.automl: 11-15 07:08:19] {1485} INFO - Data split method: uniform +[flaml.automl: 11-15 07:08:19] {1489} INFO - Evaluation method: holdout +[flaml.automl: 11-15 07:08:19] {1540} INFO - Minimizing error metric: 1-r2 +[flaml.automl: 11-15 07:08:19] {1577} INFO - List of ML learners in AutoML Run: ['lgbm', 'rf', 'catboost', 'xgboost', 'extra_tree'] +[flaml.automl: 11-15 07:08:19] {1826} INFO - iteration 0, current learner lgbm +[flaml.automl: 11-15 07:08:19] {1944} INFO - Estimated sufficient time budget=846s. Estimated necessary time budget=2s. +[flaml.automl: 11-15 07:08:19] {2029} INFO - at 0.2s, estimator lgbm's best error=0.7393, best estimator lgbm's best error=0.7393 +[flaml.automl: 11-15 07:08:19] {1826} INFO - iteration 1, current learner lgbm +[flaml.automl: 11-15 07:08:19] {2029} INFO - at 0.3s, estimator lgbm's best error=0.7393, best estimator lgbm's best error=0.7393 +[flaml.automl: 11-15 07:08:19] {1826} INFO - iteration 2, current learner lgbm +[flaml.automl: 11-15 07:08:19] {2029} INFO - at 0.3s, estimator lgbm's best error=0.5446, best estimator lgbm's best error=0.5446 +[flaml.automl: 11-15 07:08:19] {1826} INFO - iteration 3, current learner lgbm +[flaml.automl: 11-15 07:08:19] {2029} INFO - at 0.4s, estimator lgbm's best error=0.2807, best estimator lgbm's best error=0.2807 +[flaml.automl: 11-15 07:08:19] {1826} INFO - iteration 4, current learner lgbm +[flaml.automl: 11-15 07:08:19] {2029} INFO - at 0.5s, estimator lgbm's best error=0.2712, best estimator lgbm's best error=0.2712 +[flaml.automl: 11-15 07:08:19] {1826} INFO - iteration 5, current learner lgbm +[flaml.automl: 11-15 07:08:19] {2029} INFO - at 0.5s, estimator lgbm's best error=0.2712, best estimator lgbm's best error=0.2712 +[flaml.automl: 11-15 07:08:19] {1826} INFO - iteration 6, current learner lgbm +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 0.6s, estimator lgbm's best error=0.2712, best estimator lgbm's best error=0.2712 +[flaml.automl: 11-15 07:08:20] {1826} INFO - iteration 7, current learner lgbm +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 0.7s, estimator lgbm's best error=0.2197, best estimator lgbm's best error=0.2197 +[flaml.automl: 11-15 07:08:20] {1826} INFO - iteration 8, current learner xgboost +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 0.8s, estimator xgboost's best error=1.4958, best estimator lgbm's best error=0.2197 +[flaml.automl: 11-15 07:08:20] {1826} INFO - iteration 9, current learner xgboost +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 0.8s, estimator xgboost's best error=1.4958, best estimator lgbm's best error=0.2197 +[flaml.automl: 11-15 07:08:20] {1826} INFO - iteration 10, current learner xgboost +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 0.9s, estimator xgboost's best error=0.7052, best estimator lgbm's best error=0.2197 +[flaml.automl: 11-15 07:08:20] {1826} INFO - iteration 11, current learner xgboost +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 0.9s, estimator xgboost's best error=0.3619, best estimator lgbm's best error=0.2197 +[flaml.automl: 11-15 07:08:20] {1826} INFO - iteration 12, current learner xgboost +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 0.9s, estimator xgboost's best error=0.3619, best estimator lgbm's best error=0.2197 +[flaml.automl: 11-15 07:08:20] {1826} INFO - iteration 13, current learner xgboost +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 1.0s, estimator xgboost's best error=0.3619, best estimator lgbm's best error=0.2197 +[flaml.automl: 11-15 07:08:20] {1826} INFO - iteration 14, current learner extra_tree +[flaml.automl: 11-15 07:08:20] {2029} INFO - at 1.1s, estimator extra_tree's best error=0.7197, best estimator lgbm's best error=0.2197 +[flaml.automl: 11-15 07:08:20] {2242} INFO - retrain lgbm for 0.0s +[flaml.automl: 11-15 07:08:20] {2247} INFO - retrained model: LGBMRegressor(colsample_bytree=0.7610534336273627, + learning_rate=0.41929025492645006, max_bin=255, + min_child_samples=4, n_estimators=45, num_leaves=4, + reg_alpha=0.0009765625, reg_lambda=0.009280655005879943, + verbose=-1) +[flaml.automl: 11-15 07:08:20] {1608} INFO - fit succeeded +[flaml.automl: 11-15 07:08:20] {1610} INFO - Time taken to find the best model: 0.7289648056030273 +[flaml.automl: 11-15 07:08:20] {1624} WARNING - Time taken to find the best model is 73% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget. +``` + +### Multi-output regression + +We can combine `sklearn.MultiOutputRegressor` and `flaml.AutoML` to do AutoML for multi-output regression. + +```python +from flaml import AutoML +from sklearn.datasets import make_regression +from sklearn.model_selection import train_test_split +from sklearn.multioutput import MultiOutputRegressor + +# create regression data +X, y = make_regression(n_targets=3) + +# split into train and test data +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42) + +# train the model +model = MultiOutputRegressor(AutoML(task="regression", time_budget=60)) +model.fit(X_train, y_train) + +# predict +print(model.predict(X_test)) +``` + +It will perform AutoML for each target, each taking 60 seconds. \ No newline at end of file diff --git a/website/docs/Examples/AutoML-Time series forecast.md b/website/docs/Examples/AutoML-Time series forecast.md new file mode 100644 index 0000000000..530d81cc90 --- /dev/null +++ b/website/docs/Examples/AutoML-Time series forecast.md @@ -0,0 +1,203 @@ +# AutoML - Time Series Forecast + +### Prerequisites + +Install the [ts_forecast] option. +```bash +pip install "flaml[ts_forecast]" +``` + +### Univariate time series + +```python +import numpy as np +from flaml import AutoML + +X_train = np.arange('2014-01', '2021-01', dtype='datetime64[M]') +y_train = np.random.random(size=72) +automl = AutoML() +automl.fit(X_train=X_train[:72], # a single column of timestamp + y_train=y_train, # value for each timestamp + period=12, # time horizon to forecast, e.g., 12 months + task='ts_forecast', time_budget=15, # time budget in seconds + log_file_name="ts_forecast.log", + ) +print(automl.predict(X_train[72:])) +``` + +#### Sample output + +``` +[flaml.automl: 11-15 18:44:49] {1485} INFO - Data split method: time +INFO:flaml.automl:Data split method: time +[flaml.automl: 11-15 18:44:49] {1489} INFO - Evaluation method: cv +INFO:flaml.automl:Evaluation method: cv +[flaml.automl: 11-15 18:44:49] {1540} INFO - Minimizing error metric: mape +INFO:flaml.automl:Minimizing error metric: mape +[flaml.automl: 11-15 18:44:49] {1577} INFO - List of ML learners in AutoML Run: ['prophet', 'arima', 'sarimax'] +INFO:flaml.automl:List of ML learners in AutoML Run: ['prophet', 'arima', 'sarimax'] +[flaml.automl: 11-15 18:44:49] {1826} INFO - iteration 0, current learner prophet +INFO:flaml.automl:iteration 0, current learner prophet +[flaml.automl: 11-15 18:45:00] {1944} INFO - Estimated sufficient time budget=104159s. Estimated necessary time budget=104s. +INFO:flaml.automl:Estimated sufficient time budget=104159s. Estimated necessary time budget=104s. +[flaml.automl: 11-15 18:45:00] {2029} INFO - at 10.5s, estimator prophet's best error=1.5681, best estimator prophet's best error=1.5681 +INFO:flaml.automl: at 10.5s, estimator prophet's best error=1.5681, best estimator prophet's best error=1.5681 +[flaml.automl: 11-15 18:45:00] {1826} INFO - iteration 1, current learner arima +INFO:flaml.automl:iteration 1, current learner arima +[flaml.automl: 11-15 18:45:00] {2029} INFO - at 10.7s, estimator arima's best error=2.3515, best estimator prophet's best error=1.5681 +INFO:flaml.automl: at 10.7s, estimator arima's best error=2.3515, best estimator prophet's best error=1.5681 +[flaml.automl: 11-15 18:45:00] {1826} INFO - iteration 2, current learner arima +INFO:flaml.automl:iteration 2, current learner arima +[flaml.automl: 11-15 18:45:01] {2029} INFO - at 11.5s, estimator arima's best error=2.1774, best estimator prophet's best error=1.5681 +INFO:flaml.automl: at 11.5s, estimator arima's best error=2.1774, best estimator prophet's best error=1.5681 +[flaml.automl: 11-15 18:45:01] {1826} INFO - iteration 3, current learner arima +INFO:flaml.automl:iteration 3, current learner arima +[flaml.automl: 11-15 18:45:01] {2029} INFO - at 11.9s, estimator arima's best error=2.1774, best estimator prophet's best error=1.5681 +INFO:flaml.automl: at 11.9s, estimator arima's best error=2.1774, best estimator prophet's best error=1.5681 +[flaml.automl: 11-15 18:45:01] {1826} INFO - iteration 4, current learner arima +INFO:flaml.automl:iteration 4, current learner arima +[flaml.automl: 11-15 18:45:02] {2029} INFO - at 12.9s, estimator arima's best error=1.8560, best estimator prophet's best error=1.5681 +INFO:flaml.automl: at 12.9s, estimator arima's best error=1.8560, best estimator prophet's best error=1.5681 +[flaml.automl: 11-15 18:45:02] {1826} INFO - iteration 5, current learner arima +INFO:flaml.automl:iteration 5, current learner arima +[flaml.automl: 11-15 18:45:04] {2029} INFO - at 14.4s, estimator arima's best error=1.8560, best estimator prophet's best error=1.5681 +INFO:flaml.automl: at 14.4s, estimator arima's best error=1.8560, best estimator prophet's best error=1.5681 +[flaml.automl: 11-15 18:45:04] {1826} INFO - iteration 6, current learner sarimax +INFO:flaml.automl:iteration 6, current learner sarimax +[flaml.automl: 11-15 18:45:04] {2029} INFO - at 14.7s, estimator sarimax's best error=2.3515, best estimator prophet's best error=1.5681 +INFO:flaml.automl: at 14.7s, estimator sarimax's best error=2.3515, best estimator prophet's best error=1.5681 +[flaml.automl: 11-15 18:45:04] {1826} INFO - iteration 7, current learner sarimax +INFO:flaml.automl:iteration 7, current learner sarimax +[flaml.automl: 11-15 18:45:04] {2029} INFO - at 15.0s, estimator sarimax's best error=1.6371, best estimator prophet's best error=1.5681 +INFO:flaml.automl: at 15.0s, estimator sarimax's best error=1.6371, best estimator prophet's best error=1.5681 +[flaml.automl: 11-15 18:45:05] {2242} INFO - retrain prophet for 0.5s +INFO:flaml.automl:retrain prophet for 0.5s +[flaml.automl: 11-15 18:45:05] {2247} INFO - retrained model: +INFO:flaml.automl:retrained model: +[flaml.automl: 11-15 18:45:05] {1608} INFO - fit succeeded +INFO:flaml.automl:fit succeeded +[flaml.automl: 11-15 18:45:05] {1610} INFO - Time taken to find the best model: 10.450132608413696 +INFO:flaml.automl:Time taken to find the best model: 10.450132608413696 +0 0.384715 +1 0.191349 +2 0.372324 +3 0.814549 +4 0.269616 +5 0.470667 +6 0.603665 +7 0.256773 +8 0.408787 +9 0.663065 +10 0.619943 +11 0.090284 +Name: yhat, dtype: float64 +``` + +### Multivariate time series + +```python +import statsmodels.api as sm + +data = sm.datasets.co2.load_pandas().data +# data is given in weeks, but the task is to predict monthly, so use monthly averages instead +data = data['co2'].resample('MS').mean() +data = data.fillna(data.bfill()) # makes sure there are no missing values +data = data.to_frame().reset_index() +num_samples = data.shape[0] +time_horizon = 12 +split_idx = num_samples - time_horizon +train_df = data[:split_idx] # train_df is a dataframe with two columns: timestamp and label +X_test = data[split_idx:]['index'].to_frame() # X_test is a dataframe with dates for prediction +y_test = data[split_idx:]['co2'] # y_test is a series of the values corresponding to the dates for prediction + +from flaml import AutoML + +automl = AutoML() +settings = { + "time_budget": 10, # total running time in seconds + "metric": 'mape', # primary metric for validation: 'mape' is generally used for forecast tasks + "task": 'ts_forecast', # task type + "log_file_name": 'CO2_forecast.log', # flaml log file + "eval_method": "holdout", # validation method can be chosen from ['auto', 'holdout', 'cv'] + "seed": 7654321, # random seed +} + +automl.fit(dataframe=train_df, # training data + label='co2', # label column + period=time_horizon, # key word argument 'period' must be included for forecast task) + **settings) +``` + +#### Sample output + +``` +[flaml.automl: 11-15 18:54:12] {1485} INFO - Data split method: time +INFO:flaml.automl:Data split method: time +[flaml.automl: 11-15 18:54:12] {1489} INFO - Evaluation method: holdout +INFO:flaml.automl:Evaluation method: holdout +[flaml.automl: 11-15 18:54:13] {1540} INFO - Minimizing error metric: mape +INFO:flaml.automl:Minimizing error metric: mape +[flaml.automl: 11-15 18:54:13] {1577} INFO - List of ML learners in AutoML Run: ['prophet', 'arima', 'sarimax'] +INFO:flaml.automl:List of ML learners in AutoML Run: ['prophet', 'arima', 'sarimax'] +[flaml.automl: 11-15 18:54:13] {1826} INFO - iteration 0, current learner prophet +INFO:flaml.automl:iteration 0, current learner prophet +[flaml.automl: 11-15 18:54:15] {1944} INFO - Estimated sufficient time budget=25297s. Estimated necessary time budget=25s. +INFO:flaml.automl:Estimated sufficient time budget=25297s. Estimated necessary time budget=25s. +[flaml.automl: 11-15 18:54:15] {2029} INFO - at 2.6s, estimator prophet's best error=0.0008, best estimator prophet's best error=0.0008 +INFO:flaml.automl: at 2.6s, estimator prophet's best error=0.0008, best estimator prophet's best error=0.0008 +[flaml.automl: 11-15 18:54:15] {1826} INFO - iteration 1, current learner prophet +INFO:flaml.automl:iteration 1, current learner prophet +[flaml.automl: 11-15 18:54:18] {2029} INFO - at 5.2s, estimator prophet's best error=0.0008, best estimator prophet's best error=0.0008 +INFO:flaml.automl: at 5.2s, estimator prophet's best error=0.0008, best estimator prophet's best error=0.0008 +[flaml.automl: 11-15 18:54:18] {1826} INFO - iteration 2, current learner arima +INFO:flaml.automl:iteration 2, current learner arima +[flaml.automl: 11-15 18:54:18] {2029} INFO - at 5.5s, estimator arima's best error=0.0047, best estimator prophet's best error=0.0008 +INFO:flaml.automl: at 5.5s, estimator arima's best error=0.0047, best estimator prophet's best error=0.0008 +[flaml.automl: 11-15 18:54:18] {1826} INFO - iteration 3, current learner arima +INFO:flaml.automl:iteration 3, current learner arima +[flaml.automl: 11-15 18:54:18] {2029} INFO - at 5.6s, estimator arima's best error=0.0047, best estimator prophet's best error=0.0008 +INFO:flaml.automl: at 5.6s, estimator arima's best error=0.0047, best estimator prophet's best error=0.0008 +[flaml.automl: 11-15 18:54:18] {1826} INFO - iteration 4, current learner prophet +INFO:flaml.automl:iteration 4, current learner prophet +[flaml.automl: 11-15 18:54:21] {2029} INFO - at 8.1s, estimator prophet's best error=0.0005, best estimator prophet's best error=0.0005 +INFO:flaml.automl: at 8.1s, estimator prophet's best error=0.0005, best estimator prophet's best error=0.0005 +[flaml.automl: 11-15 18:54:21] {1826} INFO - iteration 5, current learner arima +INFO:flaml.automl:iteration 5, current learner arima +[flaml.automl: 11-15 18:54:21] {2029} INFO - at 8.9s, estimator arima's best error=0.0047, best estimator prophet's best error=0.0005 +INFO:flaml.automl: at 8.9s, estimator arima's best error=0.0047, best estimator prophet's best error=0.0005 +[flaml.automl: 11-15 18:54:21] {1826} INFO - iteration 6, current learner arima +INFO:flaml.automl:iteration 6, current learner arima +[flaml.automl: 11-15 18:54:22] {2029} INFO - at 9.7s, estimator arima's best error=0.0047, best estimator prophet's best error=0.0005 +INFO:flaml.automl: at 9.7s, estimator arima's best error=0.0047, best estimator prophet's best error=0.0005 +[flaml.automl: 11-15 18:54:22] {1826} INFO - iteration 7, current learner sarimax +INFO:flaml.automl:iteration 7, current learner sarimax +[flaml.automl: 11-15 18:54:23] {2029} INFO - at 10.1s, estimator sarimax's best error=0.0047, best estimator prophet's best error=0.0005 +INFO:flaml.automl: at 10.1s, estimator sarimax's best error=0.0047, best estimator prophet's best error=0.0005 +[flaml.automl: 11-15 18:54:23] {2242} INFO - retrain prophet for 0.9s +INFO:flaml.automl:retrain prophet for 0.9s +[flaml.automl: 11-15 18:54:23] {2247} INFO - retrained model: +INFO:flaml.automl:retrained model: +[flaml.automl: 11-15 18:54:23] {1608} INFO - fit succeeded +INFO:flaml.automl:fit succeeded +[flaml.automl: 11-15 18:54:23] {1610} INFO - Time taken to find the best model: 8.118467330932617 +INFO:flaml.automl:Time taken to find the best model: 8.118467330932617 +[flaml.automl: 11-15 18:54:23] {1624} WARNING - Time taken to find the best model is 81% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget. +WARNING:flaml.automl:Time taken to find the best model is 81% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget. +``` + +#### Compute and plot predictions + +```python +flaml_y_pred = automl.predict(X_test) +import matplotlib.pyplot as plt + +plt.plot(X_test, y_test, label='Actual level') +plt.plot(X_test, flaml_y_pred, label='FLAML forecast') +plt.xlabel('Date') +plt.ylabel('CO2 Levels') +plt.legend() +``` + +![png](images/CO2.png) + +[Link to notebook](https://github.com/microsoft/FLAML/blob/main/notebook/automl_time_series_forecast.ipynb) | [Open in colab](https://colab.research.google.com/github/microsoft/FLAML/blob/main/notebook/automl_time_series_forecast.ipynb) \ No newline at end of file diff --git a/website/docs/Examples/AutoML-for-LightGBM.md b/website/docs/Examples/AutoML-for-LightGBM.md new file mode 100644 index 0000000000..4840d68421 --- /dev/null +++ b/website/docs/Examples/AutoML-for-LightGBM.md @@ -0,0 +1,195 @@ +# AutoML for LightGBM + +### Use built-in LGBMEstimator + +```python +from flaml import AutoML +from flaml.data import load_openml_dataset + +# Download [houses dataset](https://www.openml.org/d/537) from OpenML. The task is to predict median price of the house in the region based on demographic composition and a state of housing market in the region. +X_train, X_test, y_train, y_test = load_openml_dataset(dataset_id=537, data_dir='./') + +automl = AutoML() +settings = { + "time_budget": 60, # total running time in seconds + "metric": 'r2', # primary metrics for regression can be chosen from: ['mae','mse','r2'] + "estimator_list": ['lgbm'], # list of ML learners; we tune lightgbm in this example + "task": 'regression', # task type + "log_file_name": 'houses_experiment.log', # flaml log file + "seed": 7654321, # random seed +} +automl.fit(X_train=X_train, y_train=y_train, **settings) +``` + +#### Sample output + +``` +[flaml.automl: 11-15 19:46:44] {1485} INFO - Data split method: uniform +[flaml.automl: 11-15 19:46:44] {1489} INFO - Evaluation method: cv +[flaml.automl: 11-15 19:46:44] {1540} INFO - Minimizing error metric: 1-r2 +[flaml.automl: 11-15 19:46:44] {1577} INFO - List of ML learners in AutoML Run: ['lgbm'] +[flaml.automl: 11-15 19:46:44] {1826} INFO - iteration 0, current learner lgbm +[flaml.automl: 11-15 19:46:44] {1944} INFO - Estimated sufficient time budget=3232s. Estimated necessary time budget=3s. +[flaml.automl: 11-15 19:46:44] {2029} INFO - at 0.5s, estimator lgbm's best error=0.7383, best estimator lgbm's best error=0.7383 +[flaml.automl: 11-15 19:46:44] {1826} INFO - iteration 1, current learner lgbm +[flaml.automl: 11-15 19:46:44] {2029} INFO - at 0.6s, estimator lgbm's best error=0.4774, best estimator lgbm's best error=0.4774 +[flaml.automl: 11-15 19:46:44] {1826} INFO - iteration 2, current learner lgbm +[flaml.automl: 11-15 19:46:44] {2029} INFO - at 0.7s, estimator lgbm's best error=0.4774, best estimator lgbm's best error=0.4774 +[flaml.automl: 11-15 19:46:44] {1826} INFO - iteration 3, current learner lgbm +[flaml.automl: 11-15 19:46:44] {2029} INFO - at 0.9s, estimator lgbm's best error=0.2985, best estimator lgbm's best error=0.2985 +[flaml.automl: 11-15 19:46:44] {1826} INFO - iteration 4, current learner lgbm +[flaml.automl: 11-15 19:46:45] {2029} INFO - at 1.3s, estimator lgbm's best error=0.2337, best estimator lgbm's best error=0.2337 +[flaml.automl: 11-15 19:46:45] {1826} INFO - iteration 5, current learner lgbm +[flaml.automl: 11-15 19:46:45] {2029} INFO - at 1.4s, estimator lgbm's best error=0.2337, best estimator lgbm's best error=0.2337 +[flaml.automl: 11-15 19:46:45] {1826} INFO - iteration 6, current learner lgbm +[flaml.automl: 11-15 19:46:46] {2029} INFO - at 2.5s, estimator lgbm's best error=0.2219, best estimator lgbm's best error=0.2219 +[flaml.automl: 11-15 19:46:46] {1826} INFO - iteration 7, current learner lgbm +[flaml.automl: 11-15 19:46:46] {2029} INFO - at 2.9s, estimator lgbm's best error=0.2219, best estimator lgbm's best error=0.2219 +[flaml.automl: 11-15 19:46:46] {1826} INFO - iteration 8, current learner lgbm +[flaml.automl: 11-15 19:46:48] {2029} INFO - at 4.5s, estimator lgbm's best error=0.1764, best estimator lgbm's best error=0.1764 +[flaml.automl: 11-15 19:46:48] {1826} INFO - iteration 9, current learner lgbm +[flaml.automl: 11-15 19:46:54] {2029} INFO - at 10.5s, estimator lgbm's best error=0.1630, best estimator lgbm's best error=0.1630 +[flaml.automl: 11-15 19:46:54] {1826} INFO - iteration 10, current learner lgbm +[flaml.automl: 11-15 19:46:56] {2029} INFO - at 12.4s, estimator lgbm's best error=0.1630, best estimator lgbm's best error=0.1630 +[flaml.automl: 11-15 19:46:56] {1826} INFO - iteration 11, current learner lgbm +[flaml.automl: 11-15 19:47:13] {2029} INFO - at 29.0s, estimator lgbm's best error=0.1630, best estimator lgbm's best error=0.1630 +[flaml.automl: 11-15 19:47:13] {1826} INFO - iteration 12, current learner lgbm +[flaml.automl: 11-15 19:47:15] {2029} INFO - at 31.1s, estimator lgbm's best error=0.1630, best estimator lgbm's best error=0.1630 +[flaml.automl: 11-15 19:47:15] {1826} INFO - iteration 13, current learner lgbm +[flaml.automl: 11-15 19:47:29] {2029} INFO - at 45.8s, estimator lgbm's best error=0.1564, best estimator lgbm's best error=0.1564 +[flaml.automl: 11-15 19:47:33] {2242} INFO - retrain lgbm for 3.2s +[flaml.automl: 11-15 19:47:33] {2247} INFO - retrained model: LGBMRegressor(colsample_bytree=0.8025848209352517, + learning_rate=0.09100963138990374, max_bin=255, + min_child_samples=42, n_estimators=363, num_leaves=216, + reg_alpha=0.001113000336715291, reg_lambda=76.50614276906414, + verbose=-1) +[flaml.automl: 11-15 19:47:33] {1608} INFO - fit succeeded +[flaml.automl: 11-15 19:47:33] {1610} INFO - Time taken to find the best model: 45.75616669654846 +[flaml.automl: 11-15 19:47:33] {1624} WARNING - Time taken to find the best model is 76% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget. +``` + +#### Retrieve best config + +```python +print('Best hyperparmeter config:', automl.best_config) +print('Best r2 on validation data: {0:.4g}'.format(1-automl.best_loss)) +print('Training duration of best run: {0:.4g} s'.format(automl.best_config_train_time)) +print(automl.model.estimator) +# Best hyperparmeter config: {'n_estimators': 363, 'num_leaves': 216, 'min_child_samples': 42, 'learning_rate': 0.09100963138990374, 'log_max_bin': 8, 'colsample_bytree': 0.8025848209352517, 'reg_alpha': 0.001113000336715291, 'reg_lambda': 76.50614276906414} +# Best r2 on validation data: 0.8436 +# Training duration of best run: 3.229 s +# LGBMRegressor(colsample_bytree=0.8025848209352517, +# learning_rate=0.09100963138990374, max_bin=255, +# min_child_samples=42, n_estimators=363, num_leaves=216, +# reg_alpha=0.001113000336715291, reg_lambda=76.50614276906414, +# verbose=-1) +``` + +#### Plot feature importance + +```python +import matplotlib.pyplot as plt +plt.barh(automl.model.estimator.feature_name_, automl.model.estimator.feature_importances_) +``` +![png](../Use-Cases/images/feature_importance.png) + +#### Compute predictions of testing dataset + +```python +y_pred = automl.predict(X_test) +print('Predicted labels', y_pred) +# Predicted labels [143391.65036562 245535.13731811 153171.44071629 ... 184354.52735963 +# 235510.49470445 282617.22858956] +``` + +#### Compute different metric values on testing dataset + +```python +from flaml.ml import sklearn_metric_loss_score +print('r2', '=', 1 - sklearn_metric_loss_score('r2', y_pred, y_test)) +print('mse', '=', sklearn_metric_loss_score('mse', y_pred, y_test)) +print('mae', '=', sklearn_metric_loss_score('mae', y_pred, y_test)) +# r2 = 0.8505434326526395 +# mse = 1975592613.138005 +# mae = 29471.536046068788 +``` + +#### Compare with untuned LightGBM + +```python +from lightgbm import LGBMRegressor + +lgbm = LGBMRegressor() +lgbm.fit(X_train, y_train) +y_pred = lgbm.predict(X_test) +from flaml.ml import sklearn_metric_loss_score +print('default lgbm r2', '=', 1 - sklearn_metric_loss_score('r2', y_pred, y_test)) +# default lgbm r2 = 0.8296179648694404 +``` + +#### Plot learning curve + +How does the model accuracy improve as we search for different hyperparameter configurations? + +```python +from flaml.data import get_output_from_log +import numpy as np + +time_history, best_valid_loss_history, valid_loss_history, config_history, metric_history = \ + get_output_from_log(filename=settings['log_file_name'], time_budget=60) +plt.title('Learning Curve') +plt.xlabel('Wall Clock Time (s)') +plt.ylabel('Validation r2') +plt.step(time_history, 1 - np.array(best_valid_loss_history), where='post') +plt.show() +``` +![png](images/lgbm_curve.png) + +### Use a customized LightGBM learner + +The native API of LightGBM allows one to specify a custom objective function in the model constructor. You can easily enable it by adding a customized LightGBM learner in FLAML. In the following example, we show how to add such a customized LightGBM learner with a custom objective function. + +#### Create a customized LightGBM learner with a custom objective function + +```python +import numpy as np + +# define your customized objective function +def my_loss_obj(y_true, y_pred): + c = 0.5 + residual = y_pred - y_true + grad = c * residual /(np.abs(residual) + c) + hess = c ** 2 / (np.abs(residual) + c) ** 2 + # rmse grad and hess + grad_rmse = residual + hess_rmse = 1.0 + + # mae grad and hess + grad_mae = np.array(residual) + grad_mae[grad_mae > 0] = 1. + grad_mae[grad_mae <= 0] = -1. + hess_mae = 1.0 + + coef = [0.4, 0.3, 0.3] + return coef[0] * grad + coef[1] * grad_rmse + coef[2] * grad_mae, \ + coef[0] * hess + coef[1] * hess_rmse + coef[2] * hess_mae + +from flaml.model import LGBMEstimator + +class MyLGBM(LGBMEstimator): + """LGBMEstimator with my_loss_obj as the objective function""" + + def __init__(self, **config): + super().__init__(objective=my_loss_obj, **config) +``` + +#### Add the customized learner and tune it + +```python +automl = AutoML() +automl.add_learner(learner_name='my_lgbm', learner_class=MyLGBM) +settings["estimator_list"] = ['my_lgbm'] # change the estimator list +automl.fit(X_train=X_train, y_train=y_train, **settings) +``` + +[Link to notebook](https://github.com/microsoft/FLAML/blob/main/notebook/automl_lightgbm.ipynb) | [Open in colab](https://colab.research.google.com/github/microsoft/FLAML/blob/main/notebook/automl_lightgbm.ipynb) \ No newline at end of file diff --git a/website/docs/Examples/AutoML-for-XGBoost.md b/website/docs/Examples/AutoML-for-XGBoost.md new file mode 100644 index 0000000000..25848b8f9c --- /dev/null +++ b/website/docs/Examples/AutoML-for-XGBoost.md @@ -0,0 +1,219 @@ +# AutoML for XGBoost + +### Use built-in XGBoostSklearnEstimator + +```python +from flaml import AutoML +from flaml.data import load_openml_dataset + +# Download [houses dataset](https://www.openml.org/d/537) from OpenML. The task is to predict median price of the house in the region based on demographic composition and a state of housing market in the region. +X_train, X_test, y_train, y_test = load_openml_dataset(dataset_id=537, data_dir='./') + +automl = AutoML() +settings = { + "time_budget": 60, # total running time in seconds + "metric": 'r2', # primary metrics for regression can be chosen from: ['mae','mse','r2'] + "estimator_list": ['xgboost'], # list of ML learners; we tune lightgbm in this example + "task": 'regression', # task type + "log_file_name": 'houses_experiment.log', # flaml log file + "seed": 7654321, # random seed +} +automl.fit(X_train=X_train, y_train=y_train, **settings) +``` + +#### Sample output + +``` +[flaml.automl: 09-29 23:06:46] {1446} INFO - Data split method: uniform +[flaml.automl: 09-29 23:06:46] {1450} INFO - Evaluation method: cv +[flaml.automl: 09-29 23:06:46] {1496} INFO - Minimizing error metric: 1-r2 +[flaml.automl: 09-29 23:06:46] {1533} INFO - List of ML learners in AutoML Run: ['xgboost'] +[flaml.automl: 09-29 23:06:46] {1763} INFO - iteration 0, current learner xgboost +[flaml.automl: 09-29 23:06:47] {1880} INFO - Estimated sufficient time budget=2621s. Estimated necessary time budget=3s. +[flaml.automl: 09-29 23:06:47] {1952} INFO - at 0.3s, estimator xgboost's best error=2.1267, best estimator xgboost's best error=2.1267 +[flaml.automl: 09-29 23:06:47] {1763} INFO - iteration 1, current learner xgboost +[flaml.automl: 09-29 23:06:47] {1952} INFO - at 0.5s, estimator xgboost's best error=2.1267, best estimator xgboost's best error=2.1267 +[flaml.automl: 09-29 23:06:47] {1763} INFO - iteration 2, current learner xgboost +[flaml.automl: 09-29 23:06:47] {1952} INFO - at 0.6s, estimator xgboost's best error=0.8485, best estimator xgboost's best error=0.8485 +[flaml.automl: 09-29 23:06:47] {1763} INFO - iteration 3, current learner xgboost +[flaml.automl: 09-29 23:06:47] {1952} INFO - at 0.8s, estimator xgboost's best error=0.3799, best estimator xgboost's best error=0.3799 +[flaml.automl: 09-29 23:06:47] {1763} INFO - iteration 4, current learner xgboost +[flaml.automl: 09-29 23:06:47] {1952} INFO - at 1.0s, estimator xgboost's best error=0.3799, best estimator xgboost's best error=0.3799 +[flaml.automl: 09-29 23:06:47] {1763} INFO - iteration 5, current learner xgboost +[flaml.automl: 09-29 23:06:47] {1952} INFO - at 1.2s, estimator xgboost's best error=0.3799, best estimator xgboost's best error=0.3799 +[flaml.automl: 09-29 23:06:47] {1763} INFO - iteration 6, current learner xgboost +[flaml.automl: 09-29 23:06:48] {1952} INFO - at 1.5s, estimator xgboost's best error=0.2992, best estimator xgboost's best error=0.2992 +[flaml.automl: 09-29 23:06:48] {1763} INFO - iteration 7, current learner xgboost +[flaml.automl: 09-29 23:06:48] {1952} INFO - at 1.9s, estimator xgboost's best error=0.2992, best estimator xgboost's best error=0.2992 +[flaml.automl: 09-29 23:06:48] {1763} INFO - iteration 8, current learner xgboost +[flaml.automl: 09-29 23:06:49] {1952} INFO - at 2.2s, estimator xgboost's best error=0.2992, best estimator xgboost's best error=0.2992 +[flaml.automl: 09-29 23:06:49] {1763} INFO - iteration 9, current learner xgboost +[flaml.automl: 09-29 23:06:49] {1952} INFO - at 2.5s, estimator xgboost's best error=0.2513, best estimator xgboost's best error=0.2513 +[flaml.automl: 09-29 23:06:49] {1763} INFO - iteration 10, current learner xgboost +[flaml.automl: 09-29 23:06:49] {1952} INFO - at 2.8s, estimator xgboost's best error=0.2513, best estimator xgboost's best error=0.2513 +[flaml.automl: 09-29 23:06:49] {1763} INFO - iteration 11, current learner xgboost +[flaml.automl: 09-29 23:06:49] {1952} INFO - at 3.0s, estimator xgboost's best error=0.2513, best estimator xgboost's best error=0.2513 +[flaml.automl: 09-29 23:06:49] {1763} INFO - iteration 12, current learner xgboost +[flaml.automl: 09-29 23:06:50] {1952} INFO - at 3.3s, estimator xgboost's best error=0.2113, best estimator xgboost's best error=0.2113 +[flaml.automl: 09-29 23:06:50] {1763} INFO - iteration 13, current learner xgboost +[flaml.automl: 09-29 23:06:50] {1952} INFO - at 3.5s, estimator xgboost's best error=0.2113, best estimator xgboost's best error=0.2113 +[flaml.automl: 09-29 23:06:50] {1763} INFO - iteration 14, current learner xgboost +[flaml.automl: 09-29 23:06:50] {1952} INFO - at 4.0s, estimator xgboost's best error=0.2090, best estimator xgboost's best error=0.2090 +[flaml.automl: 09-29 23:06:50] {1763} INFO - iteration 15, current learner xgboost +[flaml.automl: 09-29 23:06:51] {1952} INFO - at 4.5s, estimator xgboost's best error=0.2090, best estimator xgboost's best error=0.2090 +[flaml.automl: 09-29 23:06:51] {1763} INFO - iteration 16, current learner xgboost +[flaml.automl: 09-29 23:06:51] {1952} INFO - at 5.2s, estimator xgboost's best error=0.1919, best estimator xgboost's best error=0.1919 +[flaml.automl: 09-29 23:06:51] {1763} INFO - iteration 17, current learner xgboost +[flaml.automl: 09-29 23:06:52] {1952} INFO - at 5.5s, estimator xgboost's best error=0.1919, best estimator xgboost's best error=0.1919 +[flaml.automl: 09-29 23:06:52] {1763} INFO - iteration 18, current learner xgboost +[flaml.automl: 09-29 23:06:54] {1952} INFO - at 8.0s, estimator xgboost's best error=0.1797, best estimator xgboost's best error=0.1797 +[flaml.automl: 09-29 23:06:54] {1763} INFO - iteration 19, current learner xgboost +[flaml.automl: 09-29 23:06:55] {1952} INFO - at 9.0s, estimator xgboost's best error=0.1797, best estimator xgboost's best error=0.1797 +[flaml.automl: 09-29 23:06:55] {1763} INFO - iteration 20, current learner xgboost +[flaml.automl: 09-29 23:07:08] {1952} INFO - at 21.8s, estimator xgboost's best error=0.1797, best estimator xgboost's best error=0.1797 +[flaml.automl: 09-29 23:07:08] {1763} INFO - iteration 21, current learner xgboost +[flaml.automl: 09-29 23:07:11] {1952} INFO - at 24.4s, estimator xgboost's best error=0.1797, best estimator xgboost's best error=0.1797 +[flaml.automl: 09-29 23:07:11] {1763} INFO - iteration 22, current learner xgboost +[flaml.automl: 09-29 23:07:16] {1952} INFO - at 30.0s, estimator xgboost's best error=0.1782, best estimator xgboost's best error=0.1782 +[flaml.automl: 09-29 23:07:16] {1763} INFO - iteration 23, current learner xgboost +[flaml.automl: 09-29 23:07:20] {1952} INFO - at 33.5s, estimator xgboost's best error=0.1782, best estimator xgboost's best error=0.1782 +[flaml.automl: 09-29 23:07:20] {1763} INFO - iteration 24, current learner xgboost +[flaml.automl: 09-29 23:07:29] {1952} INFO - at 42.3s, estimator xgboost's best error=0.1782, best estimator xgboost's best error=0.1782 +[flaml.automl: 09-29 23:07:29] {1763} INFO - iteration 25, current learner xgboost +[flaml.automl: 09-29 23:07:30] {1952} INFO - at 43.2s, estimator xgboost's best error=0.1782, best estimator xgboost's best error=0.1782 +[flaml.automl: 09-29 23:07:30] {1763} INFO - iteration 26, current learner xgboost +[flaml.automl: 09-29 23:07:50] {1952} INFO - at 63.4s, estimator xgboost's best error=0.1663, best estimator xgboost's best error=0.1663 +[flaml.automl: 09-29 23:07:50] {2059} INFO - selected model: +[flaml.automl: 09-29 23:07:55] {2122} INFO - retrain xgboost for 5.4s +[flaml.automl: 09-29 23:07:55] {2128} INFO - retrained model: +[flaml.automl: 09-29 23:07:55] {1557} INFO - fit succeeded +[flaml.automl: 09-29 23:07:55] {1558} INFO - Time taken to find the best model: 63.427649974823 +[flaml.automl: 09-29 23:07:55] {1569} WARNING - Time taken to find the best model is 106% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget. +``` + +#### Retrieve best config + +```python +print('Best hyperparmeter config:', automl.best_config) +print('Best r2 on validation data: {0:.4g}'.format(1-automl.best_loss)) +print('Training duration of best run: {0:.4g} s'.format(automl.best_config_train_time)) +print(automl.model.estimator) +# Best hyperparmeter config: {'n_estimators': 473, 'max_leaves': 35, 'max_depth': 0, 'min_child_weight': 0.001, 'learning_rate': 0.26865031351923346, 'subsample': 0.9718245679598786, 'colsample_bylevel': 0.7421362469066445, 'colsample_bytree': 1.0, 'reg_alpha': 0.06824336834995245, 'reg_lambda': 250.9654222583276} +# Best r2 on validation data: 0.8384 +# Training duration of best run: 2.194 s +# XGBRegressor(base_score=0.5, booster='gbtree', +# colsample_bylevel=0.7421362469066445, colsample_bynode=1, +# colsample_bytree=1.0, gamma=0, gpu_id=-1, grow_policy='lossguide', +# importance_type='gain', interaction_constraints='', +# learning_rate=0.26865031351923346, max_delta_step=0, max_depth=0, +# max_leaves=35, min_child_weight=0.001, missing=nan, +# monotone_constraints='()', n_estimators=473, n_jobs=-1, +# num_parallel_tree=1, random_state=0, reg_alpha=0.06824336834995245, +# reg_lambda=250.9654222583276, scale_pos_weight=1, +# subsample=0.9718245679598786, tree_method='hist', +# use_label_encoder=False, validate_parameters=1, verbosity=0) +``` + +#### Plot feature importance + +```python +import matplotlib.pyplot as plt + +plt.barh(X_train.columns, automl.model.estimator.feature_importances_) +``` +![png](images/xgb_feature_importance.png) + +#### Compute predictions of testing dataset + +```python +y_pred = automl.predict(X_test) +print('Predicted labels', y_pred) +# Predicted labels [139062.95 237622. 140522.03 ... 182125.5 252156.36 264884.5 ] +``` + +#### Compute different metric values on testing dataset + +```python +from flaml.ml import sklearn_metric_loss_score +print('r2', '=', 1 - sklearn_metric_loss_score('r2', y_pred, y_test)) +print('mse', '=', sklearn_metric_loss_score('mse', y_pred, y_test)) +print('mae', '=', sklearn_metric_loss_score('mae', y_pred, y_test)) +# r2 = 0.8456494234135888 +# mse = 2040284106.2781258 +# mae = 30212.830996680445 +``` + +#### Compare with untuned XGBoost + +```python +from xgboost import XGBRegressor + +xgb = XGBRegressor() +xgb.fit(X_train, y_train) +y_pred = xgb.predict(X_test) +from flaml.ml import sklearn_metric_loss_score +print('default xgboost r2', '=', 1 - sklearn_metric_loss_score('r2', y_pred, y_test)) +# default xgboost r2 = 0.8265451174596482 +``` + +#### Plot learning curve + +How does the model accuracy improve as we search for different hyperparameter configurations? + +```python +from flaml.data import get_output_from_log +import numpy as np + +time_history, best_valid_loss_history, valid_loss_history, config_history, metric_history = \ + get_output_from_log(filename=settings['log_file_name'], time_budget=60) +plt.title('Learning Curve') +plt.xlabel('Wall Clock Time (s)') +plt.ylabel('Validation r2') +plt.step(time_history, 1 - np.array(best_valid_loss_history), where='post') +plt.show() +``` +![png](images/xgb_curve.png) + +### Use a customized XGBoost learner + +You can easily enable a custom objective function by adding a customized XGBoost learner (inherit XGBoostEstimator or XGBoostSklearnEstimator) in FLAML. In the following example, we show how to add such a customized XGBoost learner with a custom objective function. + +```python +import numpy as np + +# define your customized objective function +def logregobj(preds, dtrain): + labels = dtrain.get_label() + preds = 1.0 / (1.0 + np.exp(-preds)) # transform raw leaf weight + grad = preds - labels + hess = preds * (1.0 - preds) + return grad, hess + +from flaml.model import XGBoostEstimator + +class MyXGB1(XGBoostEstimator): + '''XGBoostEstimator with the logregobj function as the objective function + ''' + + def __init__(self, **config): + super().__init__(objective=logregobj, **config) + +class MyXGB2(XGBoostEstimator): + '''XGBoostEstimator with 'reg:squarederror' as the objective function + ''' + + def __init__(self, **config): + super().__init__(objective='reg:gamma', **config) +``` + +#### Add the customized learners and tune them + +```python +automl = AutoML() +automl.add_learner(learner_name='my_xgb1', learner_class=MyXGB1) +automl.add_learner(learner_name='my_xgb2', learner_class=MyXGB2) +settings["estimator_list"] = ['my_xgb1', 'my_xgb2'] # change the estimator list +automl.fit(X_train=X_train, y_train=y_train, **settings) +``` + +[Link to notebook](https://github.com/microsoft/FLAML/blob/main/notebook/automl_xgboost.ipynb) | [Open in colab](https://colab.research.google.com/github/microsoft/FLAML/blob/main/notebook/automl_xgboost.ipynb) \ No newline at end of file diff --git a/website/docs/Examples/Integrate - AzureML.md b/website/docs/Examples/Integrate - AzureML.md new file mode 100644 index 0000000000..98ae78703c --- /dev/null +++ b/website/docs/Examples/Integrate - AzureML.md @@ -0,0 +1,51 @@ +FLAML can be used together with AzureML and mlflow. + +### Prerequisites + +Install the [azureml] option. +```bash +pip install "flaml[azureml]" +``` + +Setup a AzureML workspace: +```python +from azureml.core import Workspace + +ws = Workspace.create(name='myworkspace', subscription_id='',resource_group='myresourcegroup') +``` + +### Enable mlflow in AzureML workspace + +```python +import mlflow +from azureml.core import Workspace + +ws = Workspace.from_config() +mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri()) +``` + +### Start an AutoML run + +```python +from flaml.data import load_openml_dataset + +# Download [Airlines dataset](https://www.openml.org/d/1169) from OpenML. The task is to predict whether a given flight will be delayed, given the information of the scheduled departure. +X_train, X_test, y_train, y_test = load_openml_dataset(dataset_id=1169, data_dir="./") + +from flaml import AutoML + +automl = AutoML() +settings = { + "time_budget": 60, # total running time in seconds + "metric": "accuracy", # metric to optimize + "task": "classification", # task type + "log_file_name": "airlines_experiment.log", # flaml log file +} +mlflow.set_experiment("flaml") # the experiment name in AzureML workspace +with mlflow.start_run() as run: # create a mlflow run + automl.fit(X_train=X_train, y_train=y_train, **settings) +``` + +The metrics in the run will be automatically logged in an experiment named "flaml" in your AzureML workspace. + +[Link to notebook](https://github.com/microsoft/FLAML/blob/main/notebook/integrate_azureml.ipynb) | [Open in colab](https://colab.research.google.com/github/microsoft/FLAML/blob/main/notebook/integrate_azureml.ipynb) \ No newline at end of file diff --git a/website/docs/Examples/Integrate - Scikit-learn Pipeline.md b/website/docs/Examples/Integrate - Scikit-learn Pipeline.md new file mode 100644 index 0000000000..09894321d1 --- /dev/null +++ b/website/docs/Examples/Integrate - Scikit-learn Pipeline.md @@ -0,0 +1,63 @@ +As FLAML's AutoML module can be used a transformer in the Sklearn's pipeline we can get all the benefits of pipeline. + +### Load data + +```python +from flaml.data import load_openml_dataset + +# Download [Airlines dataset](https://www.openml.org/d/1169) from OpenML. The task is to predict whether a given flight will be delayed, given the information of the scheduled departure. +X_train, X_test, y_train, y_test = load_openml_dataset( + dataset_id=1169, data_dir='./', random_state=1234, dataset_format='array') +``` + +### Create a pipeline + +```python +from sklearn import set_config +from sklearn.pipeline import Pipeline +from sklearn.impute import SimpleImputer +from sklearn.preprocessing import StandardScaler +from flaml import AutoML + +set_config(display='diagram') + +imputer = SimpleImputer() +standardizer = StandardScaler() +automl = AutoML() + +automl_pipeline = Pipeline([ + ("imputuer",imputer), + ("standardizer", standardizer), + ("automl", automl) +]) +automl_pipeline +``` +![png](images/pipeline.png) + +### Run AutoML in the pipeline + +```python +settings = { + "time_budget": 60, # total running time in seconds + "metric": 'accuracy', # primary metrics can be chosen from: ['accuracy','roc_auc', 'roc_auc_ovr', 'roc_auc_ovo', 'f1','log_loss','mae','mse','r2'] + "task": 'classification', # task type + "estimator_list":['xgboost','catboost','lgbm'], + "log_file_name": 'airlines_experiment.log', # flaml log file +} +automl_pipeline.fit(X_train, y_train, + automl__time_budget=60, + automl__metric="accuracy") +``` + +### Get the automl object from the pipeline + +```python +automl = automl_pipeline.steps[2][1] +# Get the best config and best learner +print('Best ML leaner:', automl.best_estimator) +print('Best hyperparmeter config:', automl.best_config) +print('Best accuracy on validation data: {0:.4g}'.format(1 - automl.best_loss)) +print('Training duration of best run: {0:.4g} s'.format(automl.best_config_train_time)) +``` + +[Link to notebook](https://github.com/microsoft/FLAML/blob/main/notebook/integrate_sklearn.ipynb) | [Open in colab](https://colab.research.google.com/github/microsoft/FLAML/blob/main/notebook/integrate_sklearn.ipynb) \ No newline at end of file diff --git a/website/docs/Examples/Tune-HuggingFace.md b/website/docs/Examples/Tune-HuggingFace.md new file mode 100644 index 0000000000..e6d583ff52 --- /dev/null +++ b/website/docs/Examples/Tune-HuggingFace.md @@ -0,0 +1,187 @@ +# Tune - HuggingFace + +This example uses flaml to finetune a transformer model from Huggingface transformers library. + +### Requirements + +This example requires GPU. Install dependencies: +```python +pip install torch transformers datasets "flaml[blendsearch,ray]" +``` + +### Prepare for tuning + +#### Tokenizer + +```python +from transformers import AutoTokenizer + +MODEL_NAME = "distilbert-base-uncased" +tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, use_fast=True) +COLUMN_NAME = "sentence" + +def tokenize(examples): + return tokenizer(examples[COLUMN_NAME], truncation=True) +``` + +#### Define training method + +```python +import flaml +import datasets +from transformers import AutoModelForSequenceClassification + +TASK = "cola" +NUM_LABELS = 2 + +def train_distilbert(config: dict): + # Load CoLA dataset and apply tokenizer + cola_raw = datasets.load_dataset("glue", TASK) + cola_encoded = cola_raw.map(tokenize, batched=True) + train_dataset, eval_dataset = cola_encoded["train"], cola_encoded["validation"] + + model = AutoModelForSequenceClassification.from_pretrained( + MODEL_NAME, num_labels=NUM_LABELS + ) + metric = datasets.load_metric("glue", TASK) + + def compute_metrics(eval_pred): + predictions, labels = eval_pred + predictions = np.argmax(predictions, axis=1) + return metric.compute(predictions=predictions, references=labels) + + training_args = TrainingArguments( + output_dir='.', + do_eval=False, + disable_tqdm=True, + logging_steps=20000, + save_total_limit=0, + **config, + ) + + trainer = Trainer( + model, + training_args, + train_dataset=train_dataset, + eval_dataset=eval_dataset, + tokenizer=tokenizer, + compute_metrics=compute_metrics, + ) + + # train model + trainer.train() + + # evaluate model + eval_output = trainer.evaluate() + + # report the metric to optimize & the metric to log + flaml.tune.report( + loss=eval_output["eval_loss"], + matthews_correlation=eval_output["eval_matthews_correlation"], + ) +``` + +### Define the search + +We are now ready to define our search. This includes: + +- The `search_space` for our hyperparameters +- The `metric` and the `mode` ('max' or 'min') for optimization +- The constraints (`n_cpus`, `n_gpus`, `num_samples`, and `time_budget_s`) + +```python +max_num_epoch = 64 +search_space = { + # You can mix constants with search space objects. + "num_train_epochs": flaml.tune.loguniform(1, max_num_epoch), + "learning_rate": flaml.tune.loguniform(1e-6, 1e-4), + "adam_epsilon": flaml.tune.loguniform(1e-9, 1e-7), + "adam_beta1": flaml.tune.uniform(0.8, 0.99), + "adam_beta2": flaml.tune.loguniform(98e-2, 9999e-4), +} + +# optimization objective +HP_METRIC, MODE = "matthews_correlation", "max" + +# resources +num_cpus = 4 +num_gpus = 4 # change according to your GPU resources + +# constraints +num_samples = -1 # number of trials, -1 means unlimited +time_budget_s = 3600 # time budget in seconds +``` + +### Launch the tuning + +We are now ready to launch the tuning using `flaml.tune.run`: + +```python +import ray + +ray.init(num_cpus=num_cpus, num_gpus=num_gpus) +print("Tuning started...") +analysis = flaml.tune.run( + train_distilbert, + search_alg=flaml.CFO( + space=search_space, + metric=HP_METRIC, + mode=MODE, + low_cost_partial_config={"num_train_epochs": 1}), + resources_per_trial={"gpu": num_gpus, "cpu": num_cpus}, + local_dir='logs/', + num_samples=num_samples, + time_budget_s=time_budget_s, + use_ray=True, +) +``` + +This will run tuning for one hour. At the end we will see a summary. +``` +== Status == +Memory usage on this node: 32.0/251.6 GiB +Using FIFO scheduling algorithm. +Resources requested: 0/4 CPUs, 0/4 GPUs, 0.0/150.39 GiB heap, 0.0/47.22 GiB objects (0/1.0 accelerator_type:V100) +Result logdir: /home/chiw/FLAML/notebook/logs/train_distilbert_2021-05-07_02-35-58 +Number of trials: 22/infinite (22 TERMINATED) +Trial name status loc adam_beta1 adam_beta2 adam_epsilon learning_rate num_train_epochs iter total time (s) loss matthews_correlation +train_distilbert_a0c303d0 TERMINATED 0.939079 0.991865 7.96945e-08 5.61152e-06 1 1 55.6909 0.587986 0 +train_distilbert_a0c303d1 TERMINATED 0.811036 0.997214 2.05111e-09 2.05134e-06 1.44427 1 71.7663 0.603018 0 +train_distilbert_c39b2ef0 TERMINATED 0.909395 0.993715 1e-07 5.26543e-06 1 1 53.7619 0.586518 0 +train_distilbert_f00776e2 TERMINATED 0.968763 0.990019 4.38943e-08 5.98035e-06 1.02723 1 56.8382 0.581313 0 +train_distilbert_11ab3900 TERMINATED 0.962198 0.991838 7.09296e-08 5.06608e-06 1 1 54.0231 0.585576 0 +train_distilbert_353025b6 TERMINATED 0.91596 0.991892 8.95426e-08 6.21568e-06 2.15443 1 98.3233 0.531632 0.388893 +train_distilbert_5728a1de TERMINATED 0.926933 0.993146 1e-07 1.00902e-05 1 1 55.3726 0.538505 0.280558 +train_distilbert_9394c2e2 TERMINATED 0.928106 0.990614 4.49975e-08 3.45674e-06 2.72935 1 121.388 0.539177 0.327295 +train_distilbert_b6543fec TERMINATED 0.876896 0.992098 1e-07 7.01176e-06 1.59538 1 76.0244 0.527516 0.379177 +train_distilbert_0071f998 TERMINATED 0.955024 0.991687 7.39776e-08 5.50998e-06 2.90939 1 126.871 0.516225 0.417157 +train_distilbert_2f830be6 TERMINATED 0.886931 0.989628 7.6127e-08 4.37646e-06 1.53338 1 73.8934 0.551629 0.0655887 +train_distilbert_7ce03f12 TERMINATED 0.984053 0.993956 8.70144e-08 7.82557e-06 4.08775 1 174.027 0.523732 0.453549 +train_distilbert_aaab0508 TERMINATED 0.940707 0.993946 1e-07 8.91979e-06 3.40243 1 146.249 0.511288 0.45085 +train_distilbert_14262454 TERMINATED 0.99 0.991696 4.60093e-08 4.83405e-06 3.4954 1 152.008 0.53506 0.400851 +train_distilbert_6d211fe6 TERMINATED 0.959277 0.994556 5.40791e-08 1.17333e-05 6.64995 1 271.444 0.609851 0.526802 +train_distilbert_c980bae4 TERMINATED 0.99 0.993355 1e-07 5.21929e-06 2.51275 1 111.799 0.542276 0.324968 +train_distilbert_6d0d29d6 TERMINATED 0.965773 0.995182 9.9752e-08 1.15549e-05 13.694 1 527.944 0.923802 0.549474 +train_distilbert_b16ea82a TERMINATED 0.952781 0.993931 2.93182e-08 1.19145e-05 3.2293 1 139.844 0.533466 0.451307 +train_distilbert_eddf7cc0 TERMINATED 0.99 0.997109 8.13498e-08 1.28515e-05 15.5807 1 614.789 0.983285 0.56993 +train_distilbert_43008974 TERMINATED 0.929089 0.993258 1e-07 1.03892e-05 12.0357 1 474.387 0.857461 0.520022 +train_distilbert_b3408a4e TERMINATED 0.99 0.993809 4.67441e-08 1.10418e-05 11.9165 1 474.126 0.828205 0.526164 +train_distilbert_cfbfb220 TERMINATED 0.979454 0.9999 1e-07 1.49578e-05 20.3715 +``` + +### Retrieve the results + +```python +best_trial = analysis.get_best_trial(HP_METRIC, MODE, "all") +metric = best_trial.metric_analysis[HP_METRIC][MODE] +print(f"n_trials={len(analysis.trials)}") +print(f"time={time.time()-start_time}") +print(f"Best model eval {HP_METRIC}: {metric:.4f}") +print(f"Best model parameters: {best_trial.config}") +# n_trials=22 +# time=3999.769361972809 +# Best model eval matthews_correlation: 0.5699 +# Best model parameters: {'num_train_epochs': 15.580684188655825, 'learning_rate': 1.2851507818900338e-05, 'adam_epsilon': 8.134982521948352e-08, 'adam_beta1': 0.99, 'adam_beta2': 0.9971094424784387} +``` + +[Link to notebook](https://github.com/microsoft/FLAML/blob/main/notebook/tune_huggingface.ipynb) | [Open in colab](https://colab.research.google.com/github/microsoft/FLAML/blob/main/notebook/tune_huggingface.ipynb) \ No newline at end of file diff --git a/website/docs/Examples/Tune-PyTorch.md b/website/docs/Examples/Tune-PyTorch.md new file mode 100644 index 0000000000..83f38e6098 --- /dev/null +++ b/website/docs/Examples/Tune-PyTorch.md @@ -0,0 +1,286 @@ +# Tune - PyTorch + +This example uses flaml to tune a pytorch model on CIFAR10. + +## Prepare for tuning + +### Requirements +```bash +pip install torchvision "flaml[blendsearch,ray]" +``` + +Before we are ready for tuning, we first need to define the neural network that we would like to tune. + +### Network Specification + +```python +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.utils.data import random_split +import torchvision +import torchvision.transforms as transforms + + +class Net(nn.Module): + + def __init__(self, l1=120, l2=84): + super(Net, self).__init__() + self.conv1 = nn.Conv2d(3, 6, 5) + self.pool = nn.MaxPool2d(2, 2) + self.conv2 = nn.Conv2d(6, 16, 5) + self.fc1 = nn.Linear(16 * 5 * 5, l1) + self.fc2 = nn.Linear(l1, l2) + self.fc3 = nn.Linear(l2, 10) + + def forward(self, x): + x = self.pool(F.relu(self.conv1(x))) + x = self.pool(F.relu(self.conv2(x))) + x = x.view(-1, 16 * 5 * 5) + x = F.relu(self.fc1(x)) + x = F.relu(self.fc2(x)) + x = self.fc3(x) + return x +``` + +### Data + +```python +def load_data(data_dir="data"): + transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) + ]) + + trainset = torchvision.datasets.CIFAR10( + root=data_dir, train=True, download=True, transform=transform) + + testset = torchvision.datasets.CIFAR10( + root=data_dir, train=False, download=True, transform=transform) + + return trainset, testset +``` + +### Training + +```python +from ray import tune + +def train_cifar(config, checkpoint_dir=None, data_dir=None): + if "l1" not in config: + logger.warning(config) + net = Net(2**config["l1"], 2**config["l2"]) + + device = "cpu" + if torch.cuda.is_available(): + device = "cuda:0" + if torch.cuda.device_count() > 1: + net = nn.DataParallel(net) + net.to(device) + + criterion = nn.CrossEntropyLoss() + optimizer = optim.SGD(net.parameters(), lr=config["lr"], momentum=0.9) + + # The `checkpoint_dir` parameter gets passed by Ray Tune when a checkpoint + # should be restored. + if checkpoint_dir: + checkpoint = os.path.join(checkpoint_dir, "checkpoint") + model_state, optimizer_state = torch.load(checkpoint) + net.load_state_dict(model_state) + optimizer.load_state_dict(optimizer_state) + + trainset, testset = load_data(data_dir) + + test_abs = int(len(trainset) * 0.8) + train_subset, val_subset = random_split( + trainset, [test_abs, len(trainset) - test_abs]) + + trainloader = torch.utils.data.DataLoader( + train_subset, + batch_size=int(2**config["batch_size"]), + shuffle=True, + num_workers=4) + valloader = torch.utils.data.DataLoader( + val_subset, + batch_size=int(2**config["batch_size"]), + shuffle=True, + num_workers=4) + + for epoch in range(int(round(config["num_epochs"]))): # loop over the dataset multiple times + running_loss = 0.0 + epoch_steps = 0 + for i, data in enumerate(trainloader, 0): + # get the inputs; data is a list of [inputs, labels] + inputs, labels = data + inputs, labels = inputs.to(device), labels.to(device) + + # zero the parameter gradients + optimizer.zero_grad() + + # forward + backward + optimize + outputs = net(inputs) + loss = criterion(outputs, labels) + loss.backward() + optimizer.step() + + # print statistics + running_loss += loss.item() + epoch_steps += 1 + if i % 2000 == 1999: # print every 2000 mini-batches + print("[%d, %5d] loss: %.3f" % (epoch + 1, i + 1, + running_loss / epoch_steps)) + running_loss = 0.0 + + # Validation loss + val_loss = 0.0 + val_steps = 0 + total = 0 + correct = 0 + for i, data in enumerate(valloader, 0): + with torch.no_grad(): + inputs, labels = data + inputs, labels = inputs.to(device), labels.to(device) + + outputs = net(inputs) + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + + loss = criterion(outputs, labels) + val_loss += loss.cpu().numpy() + val_steps += 1 + + # Here we save a checkpoint. It is automatically registered with + # Ray Tune and will potentially be passed as the `checkpoint_dir` + # parameter in future iterations. + with tune.checkpoint_dir(step=epoch) as checkpoint_dir: + path = os.path.join(checkpoint_dir, "checkpoint") + torch.save( + (net.state_dict(), optimizer.state_dict()), path) + + tune.report(loss=(val_loss / val_steps), accuracy=correct / total) + print("Finished Training") +``` + +### Test Accuracy + +```python +def _test_accuracy(net, device="cpu"): + trainset, testset = load_data() + + testloader = torch.utils.data.DataLoader( + testset, batch_size=4, shuffle=False, num_workers=2) + + correct = 0 + total = 0 + with torch.no_grad(): + for data in testloader: + images, labels = data + images, labels = images.to(device), labels.to(device) + outputs = net(images) + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + + return correct / total +``` + +## Hyperparameter Optimization + +```python +import numpy as np +import flaml +import os + +data_dir = os.path.abspath("data") +load_data(data_dir) # Download data for all trials before starting the run +``` + +### Search space + +```python +max_num_epoch = 100 +config = { + "l1": tune.randint(2, 9), # log transformed with base 2 + "l2": tune.randint(2, 9), # log transformed with base 2 + "lr": tune.loguniform(1e-4, 1e-1), + "num_epochs": tune.loguniform(1, max_num_epoch), + "batch_size": tune.randint(1, 5) # log transformed with base 2 +} +``` + +### Budget and resource constraints + +```python +time_budget_s = 600 # time budget in seconds +gpus_per_trial = 0.5 # number of gpus for each trial; 0.5 means two training jobs can share one gpu +num_samples = 500 # maximal number of trials +np.random.seed(7654321) +``` + +### Launch the tuning + +```python +import time +start_time = time.time() +result = flaml.tune.run( + tune.with_parameters(train_cifar, data_dir=data_dir), + config=config, + metric="loss", + mode="min", + low_cost_partial_config={"num_epochs": 1}, + max_resource=max_num_epoch, + min_resource=1, + scheduler="asha", # Use asha scheduler to perform early stopping based on intermediate results reported + resources_per_trial={"cpu": 1, "gpu": gpus_per_trial}, + local_dir='logs/', + num_samples=num_samples, + time_budget_s=time_budget_s, + use_ray=True) +``` + +### Check the result + +```python +print(f"#trials={len(result.trials)}") +print(f"time={time.time()-start_time}") +best_trial = result.get_best_trial("loss", "min", "all") +print("Best trial config: {}".format(best_trial.config)) +print("Best trial final validation loss: {}".format( + best_trial.metric_analysis["loss"]["min"])) +print("Best trial final validation accuracy: {}".format( + best_trial.metric_analysis["accuracy"]["max"])) + +best_trained_model = Net(2**best_trial.config["l1"], + 2**best_trial.config["l2"]) +device = "cpu" +if torch.cuda.is_available(): + device = "cuda:0" + if gpus_per_trial > 1: + best_trained_model = nn.DataParallel(best_trained_model) +best_trained_model.to(device) + +checkpoint_path = os.path.join(best_trial.checkpoint.value, "checkpoint") + +model_state, optimizer_state = torch.load(checkpoint_path) +best_trained_model.load_state_dict(model_state) + +test_acc = _test_accuracy(best_trained_model, device) +print("Best trial test set accuracy: {}".format(test_acc)) +``` + +### Sample of output + +``` +#trials=44 +time=1193.913584947586 +Best trial config: {'l1': 8, 'l2': 8, 'lr': 0.0008818671030627281, 'num_epochs': 55.9513429004283, 'batch_size': 3} +Best trial final validation loss: 1.0694482081472874 +Best trial final validation accuracy: 0.6389 +Files already downloaded and verified +Files already downloaded and verified +Best trial test set accuracy: 0.6294 +``` + +[Link to notebook](https://github.com/microsoft/FLAML/blob/main/notebook/tune_pytorch.ipynb) | [Open in colab](https://colab.research.google.com/github/microsoft/FLAML/blob/main/notebook/tune_pytorch.ipynb) \ No newline at end of file diff --git a/website/docs/Examples/images/CO2.png b/website/docs/Examples/images/CO2.png new file mode 100644 index 0000000000..684df085c8 Binary files /dev/null and b/website/docs/Examples/images/CO2.png differ diff --git a/website/docs/Examples/images/lgbm_curve.png b/website/docs/Examples/images/lgbm_curve.png new file mode 100644 index 0000000000..8ef8365f57 Binary files /dev/null and b/website/docs/Examples/images/lgbm_curve.png differ diff --git a/website/docs/Examples/images/pipeline.png b/website/docs/Examples/images/pipeline.png new file mode 100644 index 0000000000..2488f4e1d5 Binary files /dev/null and b/website/docs/Examples/images/pipeline.png differ diff --git a/website/docs/Examples/images/xgb_curve.png b/website/docs/Examples/images/xgb_curve.png new file mode 100644 index 0000000000..29ff34cf16 Binary files /dev/null and b/website/docs/Examples/images/xgb_curve.png differ diff --git a/website/docs/Examples/images/xgb_feature_importance.png b/website/docs/Examples/images/xgb_feature_importance.png new file mode 100644 index 0000000000..c4cef1b3d7 Binary files /dev/null and b/website/docs/Examples/images/xgb_feature_importance.png differ diff --git a/website/docs/FAQ.md b/website/docs/FAQ.md new file mode 100644 index 0000000000..437da98a14 --- /dev/null +++ b/website/docs/FAQ.md @@ -0,0 +1,30 @@ +# Frequently Asked Questions + +### About `low_cost_partial_config` in `tune`. + +- Definition and purpose: The `low_cost_partial_config` is a dictionary of subset of the hyperparameter coordinates whose value corresponds to a configuration with known low-cost (i.e., low computation cost for training the corresponding model). The concept of low/high-cost is meaningful in the case where a subset of the hyperparameters to tune directly affects the computation cost for training the model. For example, `n_estimators` and `max_leaves` are known to affect the training cost of tree-based learners. We call this subset of hyperparameters, *cost-related hyperparameters*. In such scenarios, if you are aware of low-cost configurations for the cost-related hyperparameters, you are recommended to set them as the `low_cost_partial_config`. Using the tree-based method example again, since we know that small `n_estimators` and `max_leaves` generally correspond to simpler models and thus lower cost, we set `{'n_estimators': 4, 'max_leaves': 4}` as the `low_cost_partial_config` by default (note that `4` is the lower bound of search space for these two hyperparameters), e.g., in [LGBM](https://github.com/microsoft/FLAML/blob/main/flaml/model.py#L215). Configuring `low_cost_partial_config` helps the search algorithms make more cost-efficient choices. +In AutoML, the `low_cost_init_value` in `search_space()` function for each estimator serves the same role. + +- Usage in practice: It is recommended to configure it if there are cost-related hyperparameters in your tuning task and you happen to know the low-cost values for them, but it is not required( It is fine to leave it the default value, i.e., `None`). + +- How does it work: `low_cost_partial_config` if configured, will be used as an initial point of the search. It also affects the search trajectory. For more details about how does it play a role in the search algorithms, please refer to the papers about the search algorithms used: Section 2 of [Frugal Optimization for Cost-related Hyperparameters (CFO)](https://arxiv.org/pdf/2005.01571.pdf) and Section 3 of [Economical Hyperparameter Optimization with Blended Search Strategy (BlendSearch)](https://openreview.net/pdf?id=VbLH04pRA3). + + +### How does FLAML handle imbalanced data (unequal distribution of target classes in classification task)? + +Currently FLAML does several things for imbalanced data. + +1. When a class contains fewer than 20 examples, we repeatedly add these examples to the training data until the count is at least 20. +2. We use stratified sampling when doing holdout and kf. +3. We make sure no class is empty in both training and holdout data. +4. We allow users to pass `sample_weight` to `AutoML.fit()`. + + +### How to interpret model performance? Is it possible for me to visualize feature importance, SHAP values, optimization history? + +You can use ```automl.model.estimator.feature_importances_``` to get the `feature_importances_` for the best model found by automl. See an [example](Examples/AutoML-for-XGBoost#plot-feature-importance). + +Packages such as `azureml-interpret` and `sklearn.inspection.permutation_importance` can be used on `automl.model.estimator` to explain the selected model. +Model explanation is frequently asked and adding a native support may be a good feature. Suggestions/contributions are welcome. + +Optimization history can be checked from the [log](Use-Cases/Task-Oriented-AutoML#log-the-trials). You can also [retrieve the log and plot the learning curve](Use-Cases/Task-Oriented-AutoML#plot-learning-curve). diff --git a/website/docs/Getting-Started.md b/website/docs/Getting-Started.md new file mode 100644 index 0000000000..0bc7c7ab69 --- /dev/null +++ b/website/docs/Getting-Started.md @@ -0,0 +1,87 @@ +# Getting Started + + + +FLAML is a lightweight Python library that finds accurate machine +learning models automatically, efficiently and economically. It frees users from selecting learners and hyperparameters for each learner. + +### Main Features + +1. For common machine learning tasks like classification and regression, it quickly finds quality models for user-provided data with low computational resources. It supports both classifcal machine learning models and deep neural networks. + +2. It is easy to customize or extend. Users can choose their desired customizability: minimal customization (computational resource budget), medium customization (e.g., scikit-style learner, search space and metric), or full customization (arbitrary training and evaluation code). + +3. It supports fast and economical automatic tuning, capable of handling large search space with heterogeneous evaluation cost and complex constraints/guidance/early stopping. FLAML is powered by a new, [cost-effective +hyperparameter optimization](Use-Cases/Tune-User-Defined-Function#hyperparameter-optimization-algorithm) +and learner selection method invented by Microsoft Research. + +### Quickstart + +Install FLAML from pip: `pip install flaml`. Find more options in [Installation](Installation). + +There are two ways of using flaml: + +#### [Task-oriented AutoML](Use-Cases/task-oriented-automl) + +For example, with three lines of code, you can start using this economical and fast AutoML engine as a scikit-learn style estimator. + +```python +from flaml import AutoML +automl = AutoML() +automl.fit(X_train, y_train, task="classification") +``` + +It automatically tunes the hyparparameters and selects the best model from default learners such as LightGBM, XGBoost, random forest etc. [Customizing](Use-Cases/task-oriented-automl#customize-automlfit) the optimization metrics, learners and search spaces etc. is very easy. For example, + +```python +automl.add_learner("mylgbm", MyLGBMEstimator) +automl.fit(X_train, y_train, task="classification", metric=custom_metric, estimator_list=["mylgbm"]) +``` + +#### [Tune user-defined function](Use-Cases/Tune-User-Defined-Function) + +You can run generic hyperparameter tuning for a custom function (machine learning or beyond). For example, + +```python +from flaml import tune +from flaml.model import LGBMEstimator + +def train_lgbm(config: dict) -> dict: + # convert config dict to lgbm params + params = LGBMEstimator(**config).params + num_boost_round = params.pop("n_estimators") + # train the model + train_set = lightgbm.Dataset(X_train, y_train) + model = lightgbm.train(params, train_set, num_boost_round) + # evaluate the model + pred = model.predict(X_test) + mse = mean_squared_error(y_test, pred) + # return eval results as a dictionary + return {"mse": mse} + +# load a built-in search space from flaml +flaml_lgbm_search_space = LGBMEstimator.search_space(X_train.shape) +# specify the search space as a dict from hp name to domain; you can define your own search space same way +config_search_space = {hp: space["domain"] for hp, space in flaml_lgbm_search_space.items()} +# give guidance about hp values corresponding to low training cost, i.e., {"n_estimators": 4, "num_leaves": 4} +low_cost_partial_config = { + hp: space["low_cost_init_value"] + for hp, space in flaml_lgbm_search_space.items() + if "low_cost_init_value" in space +} +# run the tuning, minimizing mse, with total time budget 3 seconds +analysis = tune.run( + train_lgbm, metric="mse", mode="min", config=config_search_space, + low_cost_partial_config=low_cost_partial_config, time_budget_s=3, num_samples=-1, +) +``` + +### Where to Go Next? + +* Understand the use cases for [Task-oriented AutoML](Use-Cases/task-oriented-automl) and [Tune user-defined function](Use-Cases/Tune-User-Defined-Function). +* Find code examples under "Examples": from [AutoML - Classification](Examples/AutoML-Classification) to [Tune - PyTorch](Examples/Tune-PyTorch). +* Watch [video tutorials](https://www.youtube.com/channel/UCfU0zfFXHXdAd5x-WvFBk5A). +* Learn about [research](Research) around FLAML. +* Refer to [SDK](reference/automl) and [FAQ](FAQ). + +If you like our project, please give it a [star](https://github.com/microsoft/FLAML/stargazers) on GitHub. If you are interested in contributing, please read [Contributor's Guide](Contribute). \ No newline at end of file diff --git a/website/docs/Installation.md b/website/docs/Installation.md new file mode 100644 index 0000000000..5008a16e06 --- /dev/null +++ b/website/docs/Installation.md @@ -0,0 +1,63 @@ +# Installation + +FLAML requires **Python version >= 3.6**. It can be installed from pip: + +```bash +pip install flaml +``` + +or conda: +``` +conda install flaml -c conda-forge +``` + +FLAML has a .NET implementation as well from [ML.NET Model Builder](https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet/model-builder) in [Visual Studio](https://visualstudio.microsoft.com/) 2022. + +## Optional Dependencies + +### Notebook +To run the [notebook examples](https://github.com/microsoft/FLAML/tree/main/notebook), +install flaml with the [notebook] option: + +```bash +pip install flaml[notebook] +``` + +### Extra learners +* catboost +```bash +pip install flaml[catboost] +``` +* vowpal wabbit +```bash +pip install flaml[vw] +``` +* time series forecaster: prophet, statsmodels +```bash +pip install flaml[forecast] +``` + +### Distributed tuning +* ray +```bash +pip install flaml[ray] +``` +* nni +```bash +pip install flaml[nni] +``` +* blendsearch +```bash +pip install flaml[blendsearch] +``` + +### Test and Benchmark +* test +```bash +pip install flaml[test] +``` +* benchmark +```bash +pip install flaml[benchmark] +``` + diff --git a/website/docs/Research.md b/website/docs/Research.md new file mode 100644 index 0000000000..80caa14dc1 --- /dev/null +++ b/website/docs/Research.md @@ -0,0 +1,20 @@ +# Research in FLAML + +For technical details, please check our research publications. + +* [FLAML: A Fast and Lightweight AutoML Library](https://www.microsoft.com/en-us/research/publication/flaml-a-fast-and-lightweight-automl-library/). Chi Wang, Qingyun Wu, Markus Weimer, Erkang Zhu. MLSys 2021. + +```bibtex +@inproceedings{wang2021flaml, + title={FLAML: A Fast and Lightweight AutoML Library}, + author={Chi Wang and Qingyun Wu and Markus Weimer and Erkang Zhu}, + year={2021}, + booktitle={MLSys}, +} +``` + +* [Frugal Optimization for Cost-related Hyperparameters](https://arxiv.org/abs/2005.01571). Qingyun Wu, Chi Wang, Silu Huang. AAAI 2021. +* [Economical Hyperparameter Optimization With Blended Search Strategy](https://www.microsoft.com/en-us/research/publication/economical-hyperparameter-optimization-with-blended-search-strategy/). Chi Wang, Qingyun Wu, Silu Huang, Amin Saied. ICLR 2021. +* [ChaCha for Online AutoML](https://www.microsoft.com/en-us/research/publication/chacha-for-online-automl/). Qingyun Wu, Chi Wang, John Langford, Paul Mineiro and Marco Rossi. ICML 2021. + +Many researchers and engineers have contributed to the technology development. In alphabetical order: Vijay Aski, Sebastien Bubeck, Surajit Chaudhuri, Kevin Chen, Yi Wei Chen, Nadiia Chepurko, Ofer Dekel, Alex Deng, Anshuman Dutt, Nicolo Fusi, Jianfeng Gao, Johannes Gehrke, Niklas Gustafsson, Silu Huang, Moe Kayali, Dongwoo Kim, Christian Konig, John Langford, Menghao Li, Mingqin Li, Xueqing Liu, Zhe Liu, Naveen Gaur, Paul Mineiro, Vivek Narasayya, Jake Radzikowski, Marco Rossi, Amin Saied, Neil Tenenholtz, Olga Vrousgou, Chi Wang, Yue Wang, Markus Weimer, Qingyun Wu, Qiufeng Yin, Haozhe Zhang, Minjia Zhang, XiaoYun Zhang, Eric Zhu. \ No newline at end of file diff --git a/website/docs/Use-Cases/Task-Oriented-AutoML.md b/website/docs/Use-Cases/Task-Oriented-AutoML.md new file mode 100644 index 0000000000..3850d700bb --- /dev/null +++ b/website/docs/Use-Cases/Task-Oriented-AutoML.md @@ -0,0 +1,478 @@ +# Task Oriented AutoML + +## Overview + +`flaml.AutoML` is a class for task-oriented AutoML. It can be used as a scikit-learn style estimator with the standard `fit` and `predict` functions. The minimal inputs from users are the training data and the task type. + +* Training data: + - numpy array. When the input data are stored in numpy array, they are passed to `fit()` as `X_train` and `y_train`. + - pandas dataframe. When the input data are stored in pandas dataframe, they are passed to `fit()` either as `X_train` and `y_train`, or as `dataframe` and `label`. +* Tasks (specified via `task`): + - 'classification': classification. + - 'regression': regression. + - 'ts_forecast': time series forecasting. + - 'rank': learning to rank. + - 'seq-classification': sequence classification. + - 'seq-regression': sequence regression. + +An optional input is `time_budget` for searching models and hyperparameters. When not specified, a default budget of 60 seconds will be used. + +A typical way to use `flaml.AutoML`: + +```python +# Prepare training data +# ... +from flaml import AutoML +automl = AutoML() +automl.fit(X_train, y_train, task="regression", time_budget=60, **other_settings) +# Save the model +with open("automl.pkl", "wb") as f: + pickle.dump(automl, f, pickle.HIGHEST_PROTOCOL) + +# At prediction time +with open("automl.pkl", "rb") as f: + automl = pickle.load(f) +pred = automl.predict(X_test) +``` + +If users provide the minimal inputs only, `AutoML` uses the default settings for time budget, optimization metric, estimator list etc. + +## Customize AutoML.fit() + +### Optimization metric + +The optimization metric is specified via the `metric` argument. It can be either a string which refers to a built-in metric, or a user-defined function. + +* Built-in metric. + - 'accuracy': 1 - accuracy as the corresponding metric to minimize. + - 'log_loss': default metric for multiclass classification. + - 'r2': 1 - r2_score as the corresponding metric to minimize. Default metric for regression. + - 'rmse': root mean squared error. + - 'mse': mean squared error. + - 'mae': mean absolute error. + - 'mape': mean absolute percentage error. + - 'roc_auc': minimize 1 - roc_auc_score. Default metric for binary classification. + - 'roc_auc_ovr': minimize 1 - roc_auc_score with `multi_class="ovr"`. + - 'roc_auc_ovo': minimize 1 - roc_auc_score with `multi_class="ovo"`. + - 'f1': minimize 1 - f1_score. + - 'micro_f1': minimize 1 - f1_score with `average="micro"`. + - 'micro_f1': minimize 1 - f1_score with `average="micro"`. + - 'ap': minimize 1 - average_precision_score. + - 'ndcg': minimize 1 - ndcg_score. + - 'ndcg@k': minimize 1 - ndcg_score@k. k is an integer. +* User-defined function. +A customized metric function that requires the following (input) signature, and returns the input config’s value in terms of the metric you want to minimize, and a dictionary of auxiliary information at your choice: + +```python +def custom_metric( + X_val, y_val, estimator, labels, + X_train, y_train, weight_val=None, weight_train=None, + config=None, groups_val=None, groups_train=None, +): + return metric_to_minimize, metrics_to_log +``` + +For example, +```python +def custom_metric( + X_val, y_val, estimator, labels, + X_train, y_train, weight_val=None, weight_train=None, + **args, +): + from sklearn.metrics import log_loss + import time + + start = time.time() + y_pred = estimator.predict_proba(X_val) + pred_time = (time.time() - start) / len(X_val) + val_loss = log_loss(y_val, y_pred, labels=labels, sample_weight=weight_val) + y_pred = estimator.predict_proba(X_train) + train_loss = log_loss(y_train, y_pred, labels=labels, sample_weight=weight_train) + alpha = 0.5 + return val_loss * (1 + alpha) - alpha * train_loss, { + "val_loss": val_loss, + "train_loss": train_loss, + "pred_time": pred_time, + } +``` +It returns the validation loss penalized by the gap between validation and training loss as the metric to minimize, and three metrics to log: val_loss, train_loss and pred_time. The arguments `config`, `groups_val` and `groups_train` are not used in the function. + +### Estimator and search space + +The estimator list can contain one or more estimator names, each corresponding to a built-in estimator or a custom estimator. Each estimator has a search space for hyperparameter configurations. FLAML supports both classical machine learning models and deep neural networks. + +#### Estimator +* Built-in estimator. + - 'lgbm': LGBMEstimator. Hyperparameters: n_estimators, num_leaves, min_child_samples, learning_rate, log_max_bin (logarithm of (max_bin + 1) with base 2), colsample_bytree, reg_alpha, reg_lambda. + - 'xgboost': XGBoostSkLearnEstimator. Hyperparameters: n_estimators, max_leaves, max_depth, min_child_weight, learning_rate, subsample, colsample_bylevel, colsample_bytree, reg_alpha, reg_lambda. + - 'rf': RandomForestEstimator. Hyperparameters: n_estimators, max_features, max_leaves, criterion (for classification only). + - 'extra_tree': ExtraTreesEstimator. Hyperparameters: n_estimators, max_features, max_leaves, criterion (for classification only). + - 'lrl1': LRL1Classifier (sklearn.LogisticRegression with L1 regularization). Hyperparameters: C. + - 'lrl2': LRL2Classifier (sklearn.LogisticRegression with L2 regularization). Hyperparameters: C. + - 'catboost': CatBoostEstimator. Hyperparameters: early_stopping_rounds, learning_rate, n_estimators. + - 'kneighbor': KNeighborsEstimator. Hyperparameters: n_neighbors. + - 'prophet': Prophet. Hyperparameters: changepoint_prior_scale, seasonality_prior_scale, holidays_prior_scale, seasonality_mode. + - 'arima': ARIMA. Hyperparameters: p, d, q. + - 'sarimax': SARIMAX. Hyperparameters: p, d, q, P, D, Q, s. + - 'transformer': Huggingface transformer models. Hyperparameters: learning_rate, num_train_epochs, per_device_train_batch_size, warmup_ratio, weight_decay, adam_epsilon, seed. +* Custom estimator. Use custom estimator for: + - tuning an estimator that is not built-in; + - customizing search space for a built-in estimator. + +To tune a custom estimator that is not built-in, you need to: + +1. Build a custom estimator by inheritting `flaml.model.BaseEstimator` or a derived class. +For example, if you have a estimator class with scikit-learn style `fit()` and `predict()` functions, you only need to set `self.estimator_class` to be that class in your constructor. + +```python +from flaml.model import SKLearnEstimator +# SKLearnEstimator is derived from BaseEstimator +import rgf + +class MyRegularizedGreedyForest(SKLearnEstimator): + def __init__(self, task="binary", **config): + super().__init__(task, **config) + + if task in CLASSIFICATION: + from rgf.sklearn import RGFClassifier + + self.estimator_class = RGFClassifier + else: + from rgf.sklearn import RGFRegressor + + self.estimator_class = RGFRegressor + + @classmethod + def search_space(cls, data_size, task): + space = { + "max_leaf": { + "domain": tune.lograndint(lower=4, upper=data_size), + "low_cost_init_value": 4, + }, + "n_iter": { + "domain": tune.lograndint(lower=1, upper=data_size), + "low_cost_init_value": 1, + }, + "learning_rate": {"domain": tune.loguniform(lower=0.01, upper=20.0)}, + "min_samples_leaf": { + "domain": tune.lograndint(lower=1, upper=20), + "init_value": 20, + }, + } + return space +``` + +In the constructor, we set `self.estimator_class` as `RGFClassifier` or `RGFRegressor` according to the task type. If the estimator you want to tune does not have a scikit-learn style `fit()` and `predict()` API, you can override the `fit()` and `predict()` function of `flaml.model.BaseEstimator`, like [XGBoostEstimator](https://github.com/microsoft/FLAML/blob/59083fbdcb95c15819a0063a355969203022271c/flaml/model.py#L511). + +2. Give the custom estimator a name and add it in AutoML. E.g., + +```python +from flaml import AutoML +automl = AutoML() +automl.add_learner("rgf", MyRegularizedGreedyForest) +``` + +This registers the `MyRegularizedGreedyForest` class in AutoML, with the name "rgf". + +3. Tune the newly added custom estimator in either of the following two ways depending on your needs: +- tune rgf alone: `automl.fit(..., estimator_list=["rgf"])`; or +- mix it with other built-in learners: `automl.fit(..., estimator_list=["rgf", "lgbm", "xgboost", "rf"])`. + +#### Search space + +Each estimator class, built-in or not, must have a `search_space` function. In the `search_space` function, we return a dictionary about the hyperparameters, the keys of which are the names of the hyperparameters to tune, and each value is a set of detailed search configurations about the corresponding hyperparameters represented in a dictionary. A search configuration dictionary includes the following fields: +* `domain`, which specifies the possible values of the hyperparameter and their distribution. Please refer to [more details about the search space domain](Tune-User-Defined-Function#more-details-about-the-search-space-domain). +* `init_value` (optional), which specifies the initial value of the hyperparameter. +* `low_cost_init_value`(optional), which specifies the value of the hyperparameter that is associated with low computation cost. See [cost related hyperparameters](Tune-User-Defined-Function#cost-related-hyperparameters) or [FAQ](../FAQ#about-low_cost_partial_config-in-tune) for more details. + +In the example above, we tune four hyperparameters, three integers and one float. They all follow a log-uniform distribution. "max_leaf" and "n_iter" have "low_cost_init_value" specified as their values heavily influence the training cost. + + + + +To customize the search space for a built-in estimator, use a similar approach to define a class that inherits the existing estimator. For example, + +```python +from flaml.model import XGBoostEstimator + +def logregobj(preds, dtrain): + labels = dtrain.get_label() + preds = 1.0 / (1.0 + np.exp(-preds)) # transform raw leaf weight + grad = preds - labels + hess = preds * (1.0 - preds) + return grad, hess + +class MyXGB1(XGBoostEstimator): + """XGBoostEstimator with logregobj as the objective function""" + + def __init__(self, **config): + super().__init__(objective=logregobj, **config) +``` + +We override the constructor and set the training objective as a custom function `logregobj`. The hyperparameters and their search range do not change. For another example, + +```python +class XGBoost2D(XGBoostSklearnEstimator): + @classmethod + def search_space(cls, data_size, task): + upper = min(32768, int(data_size)) + return { + "n_estimators": { + "domain": tune.lograndint(lower=4, upper=upper), + "low_cost_init_value": 4, + }, + "max_leaves": { + "domain": tune.lograndint(lower=4, upper=upper), + "low_cost_init_value": 4, + }, + } +``` + +We override the `search_space` function to tune two hyperparameters only, "n_estimators" and "max_leaves". They are both random integers in the log space, ranging from 4 to data-dependent upper bound. The lower bound for each corresponds to low training cost, hence the "low_cost_init_value" for each is set to 4. + +### Constraint + +There are several types of constraints you can impose. + +1. End-to-end constraints on the AutoML process. + +- `time_budget`: constrains the wall-clock time (seconds) used by the AutoML process. We provide some tips on [how to set time budget](#how-to-set-time-budget). + +- `max_iter`: constrains the maximal number of models to try in the AutoML process. + +2. Constraints on the (hyperparameters of) the estimators. + +Some constraints on the estimator can be implemented via the custom learner. For example, + +```python +class MonotonicXGBoostEstimator(XGBoostSklearnEstimator): + @classmethod + def search_space(**args): + return super().search_space(**args).update({"monotone_constraints": "(1, -1)"}) +``` + +It adds a monotonicity constraint to XGBoost. This approach can be used to set any constraint that is a parameter in the underlying estimator's constructor. + +3. Constraints on the models tried in AutoML. + +Users can set constraints such as the maximal number of models to try, limit on training time and prediction time per model. +* `train_time_limit`: training time in seconds. +* `pred_time_limit`: prediction time per instance in seconds. + +For example, +```python +automl.fit(X_train, y_train, max_iter=100, train_time_limit=1, pred_time_limit=1e-3) +``` + +### Ensemble + +To use stacked ensemble after the model search, set `ensemble=True` or a dict. When `ensemble=True`, the final estimator and `passthrough` in the stacker will be automatically chosen. You can specify customized final estimator or passthrough option: +* "final_estimator": an instance of the final estimator in the stacker. +* "passthrough": True (default) or False, whether to pass the original features to the stacker. + +For example, +```python +automl.fit( + X_train, y_train, task="classification", + "ensemble": { + "final_estimator": LogisticRegression(), + "passthrough": False, + }, +) +``` + +### Resampling strategy + +By default, flaml decides the resampling automatically according to the data size and the time budget. If you would like to enforce a certain resampling strategy, you can set `eval_method` to be "holdout" or "cv" for holdout or cross-validation. + +For holdout, you can also set: +* `split_ratio`: the fraction for validation data, 0.1 by default. +* `X_val`, `y_val`: a separate validation dataset. When they are passed, the validation metrics will be computed against this given validation dataset. If they are not passed, then a validation dataset will be split from the training data and held out from training during the model search. After the model search, flaml will retrain the model with best configuration on the full training data. +You can set`retrain_full` to be `False` to skip the final retraining or "budget" to ask flaml to do its best to retrain within the time budget. + +For cross validation, you can also set `n_splits` of the number of folds. By default it is 5. + +#### Data split method + +By default, flaml uses the following method to split the data: +* stratified split for classification; +* uniform split for regression; +* time-based split for time series forecasting; +* group-based split for learning to rank. + +The data split method for classification can be changed into uniform split by setting `split_type="uniform"`. For both classification and regression, time-based split can be enforced if the data are sorted by timestamps, by setting `split_type="time"`. + +### Parallel tuning + +When you have parallel resources, you can either spend them in training and keep the model search sequential, or perform parallel search. Following scikit-learn, the parameter `n_jobs` specifies how many CPU cores to use for each training job. The number of parallel trials is specified via the parameter `n_concurrent_trials`. By default, `n_jobs=-1, n_concurrent_trials=1`. That is, all the CPU cores (in a single compute node) are used for training a single model and the search is sequential. When you have more resources than what each single training job needs, you can consider increasing `n_concurrent_trials`. + +To do parallel tuning, install the `ray` and `blendsearch` options: +```bash +pip install flaml[ray,blendsearch] +``` + +`ray` is used to manage the resources. For example, +```python +ray.init(n_cpus=16) +``` +allocates 16 CPU cores. Then, when you run: +```python +automl.fit(X_train, y_train, n_jobs=4, n_concurrent_trials=4) +``` +flaml will perform 4 trials in parallel, each consuming 4 CPU cores. The parallel tuning uses the [BlendSearch](Tune-User-Defined-Function##blendsearch-economical-hyperparameter-optimization-with-blended-search-strategy) algorithm. + + +### Warm start + +We can warm start the AutoML by providing starting points of hyperparameter configurstions for each estimator. For example, if you have run AutoML for one hour, after checking the results, you would like to run it for another two hours, then you can use the best configurations found for each estimator as the starting points for the new run. + +```python +automl1 = AutoML() +automl1.fit(X_train, y_train, time_budget=3600) +automl2 = AutoML() +automl2.fit(X_train, y_train, time_budget=7200, starting_points=automl1.best_config_per_estimator) +``` + +`starting_points` is a dictionary. The keys are the estimator names. If you do not need to specify starting points for an estimator, exclude its name from the dictionary. The value for each key can be either a dictionary of a list of dictionaries, corresponding to one hyperparameter configuration, or multiple hyperparameter configurations, respectively. + +### Log the trials + +The trials are logged in a file if a `log_file_name` is passed. +Each trial is logged as a json record in one line. The best trial's id is logged in the last line. For example, +``` +{"record_id": 0, "iter_per_learner": 1, "logged_metric": null, "trial_time": 0.12717914581298828, "wall_clock_time": 0.1728971004486084, "validation_loss": 0.07333333333333332, "config": {"n_estimators": 4, "num_leaves": 4, "min_child_samples": 20, "learning_rate": 0.09999999999999995, "log_max_bin": 8, "colsample_bytree": 1.0, "reg_alpha": 0.0009765625, "reg_lambda": 1.0}, "learner": "lgbm", "sample_size": 150} +{"record_id": 1, "iter_per_learner": 3, "logged_metric": null, "trial_time": 0.07027268409729004, "wall_clock_time": 0.3756711483001709, "validation_loss": 0.05333333333333332, "config": {"n_estimators": 4, "num_leaves": 4, "min_child_samples": 12, "learning_rate": 0.2677050123105203, "log_max_bin": 7, "colsample_bytree": 1.0, "reg_alpha": 0.001348364934537134, "reg_lambda": 1.4442580148221913}, "learner": "lgbm", "sample_size": 150} +{"curr_best_record_id": 1} +``` + +1. `iter_per_learner` means how many models have been tried for each learner. The reason you see records like `iter_per_learner=3` for `record_id=1` is that flaml only logs better configs than the previous iters by default, i.e., `log_type='better'`. If you use `log_type='all'` instead, all the trials will be logged. +1. `trial_time` means the time taken to train and evaluate one config in that trial. `total_search_time` is the total time spent from the beginning of `fit()`. +1. flaml will adjust the `n_estimators` for lightgbm etc. according to the remaining budget and check the time budget constraint and stop in several places. Most of the time that makes `fit()` stops before the given budget. Occasionally it may run over the time budget slightly. But the log file always contains the best config info and you can recover the best model until any time point using `retrain_from_log()`. + +We can also use mlflow for logging: +```python +mlflow.set_experiment("flaml") +with mlflow.start_run(): + automl.fit(X_train=X_train, y_train=y_train, **settings) +``` + +### Extra fit arguments + +Extra fit arguments that are needed by the estimators can be passed to `AutoML.fit()`. For example, if there is a weight associated with each training example, they can be passed via `sample_weight`. For another example, `period` can be passed for time series forecaster. For any extra keywork argument passed to `AutoML.fit()` which has not been explicitly listed in the function signature, it will be passed to the underlying estimators' `fit()` as is. + +## Retrieve and analyze the outcomes of AutoML.fit() + +### Get best model + +The best model can be obtained by the `model` property of an `AutoML` instance. For example, + +```python +automl.fit(X_train, y_train, task="regression") +print(automl.mdoel) +# +``` + +`flaml.model.LGBMEstimator` is a wrapper class for LightGBM models. To access the underlying model, use the `estimator` property of the `flaml.model.LGBMEstimator` instance. + +```python +print(automl.model.estimator) +''' +LGBMRegressor(colsample_bytree=0.7610534336273627, + learning_rate=0.41929025492645006, max_bin=255, + min_child_samples=4, n_estimators=45, num_leaves=4, + reg_alpha=0.0009765625, reg_lambda=0.009280655005879943, + verbose=-1) +''' +``` + +Just like a normal LightGBM model, we can inspect it. For example, we can plot the feature importance: +```python +import matplotlib.pyplot as plt +plt.barh(automl.model.estimator.feature_name_, automl.model.estimator.feature_importances_) +``` +![png](images/feature_importance.png) + +### Get best configuration + +We can find the best estimator's name and best configuration by: + +```python +print(automl.best_estimator) +# lgbm +print(automl.best_config) +# {'n_estimators': 148, 'num_leaves': 18, 'min_child_samples': 3, 'learning_rate': 0.17402065726724145, 'log_max_bin': 8, 'colsample_bytree': 0.6649148062238498, 'reg_alpha': 0.0009765625, 'reg_lambda': 0.0067613624509965} +``` + +We can also find the best configuration per estimator. + +```python +print(automl.best_config_per_estimator) +# {'lgbm': {'n_estimators': 148, 'num_leaves': 18, 'min_child_samples': 3, 'learning_rate': 0.17402065726724145, 'log_max_bin': 8, 'colsample_bytree': 0.6649148062238498, 'reg_alpha': 0.0009765625, 'reg_lambda': 0.0067613624509965}, 'rf': None, 'catboost': None, 'xgboost': {'n_estimators': 4, 'max_leaves': 4, 'min_child_weight': 1.8630223791106992, 'learning_rate': 1.0, 'subsample': 0.8513627344387318, 'colsample_bylevel': 1.0, 'colsample_bytree': 0.946138073111236, 'reg_alpha': 0.0018311776973217073, 'reg_lambda': 0.27901659190538414}, 'extra_tree': {'n_estimators': 4, 'max_features': 1.0, 'max_leaves': 4}} +``` + +The `None` value corresponds to the estimators which have not been tried. + +Other useful information: +```python +print(automl.best_config_train_time) +# 0.24841618537902832 +print(automl.best_iteration) +# 10 +print(automl.best_loss) +# 0.15448622217577546 +print(automl.time_to_find_best_model) +# 0.4167296886444092 +print(automl.config_history) +# {0: ('lgbm', {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0}, 1.2300517559051514)} +# Meaning: at iteration 0, the config tried is {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0} for lgbm, and the wallclock time is 1.23s when this trial is finished. +``` + +### Plot learning curve + +To plot how the loss is improved over time during the model search, first load the search history from the log file: + +```python +from flaml.data import get_output_from_log + +time_history, best_valid_loss_history, valid_loss_history, config_history, metric_history = \ + get_output_from_log(filename=settings["log_file_name"], time_budget=120) +``` + +Then, assuming the optimization metric is "accuracy", we can plot the accuracy versus wallclock time: + +```python +import matplotlib.pyplot as plt +import numpy as np + +plt.title("Learning Curve") +plt.xlabel("Wall Clock Time (s)") +plt.ylabel("Validation Accuracy") +plt.step(time_history, 1 - np.array(best_valid_loss_history), where="post") +plt.show() +``` + +![png](images/curve.png) + +The curve suggests that increasing the time budget may further improve the accuracy. + +### How to set time budget + +* If you have an exact constraint for the total search time, set it as the time budget. +* If you have flexible time constraints, for example, your desirable time budget is t1=60s, and the longest time budget you can tolerate is t2=3600s, you can try the following two ways: +1. set t1 as the time budget, and check the message in the console log in the end. If the budget is too small, you will see a warning like +> WARNING - Time taken to find the best model is 91% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget. +2. set t2 as the time budget, and also set `early_stop=True`. If the early stopping is triggered, you will see a warning like + > WARNING - All estimator hyperparameters local search has converged at least once, and the total search time exceeds 10 times the time taken to find the best model. + + > WARNING - Stopping search as early_stop is set to True. + +### How much time is needed to find the best model + +If you want to get a sense of how much time is needed to find the best model, you can use `max_iter=2` to perform two trials first. The message will be like: +> INFO - iteration 0, current learner lgbm + +> INFO - Estimated sufficient time budget=145194s. Estimated necessary time budget=2118s. + +> INFO - at 2.6s, estimator lgbm's best error=0.4459, best estimator lgbm's best error=0.4459 + +You will see that the time to finish the first and cheapest trial is 2.6 seconds. The estimated necessary time budget is 2118 seconds, and the estimated sufficient time budget is 145194 seconds. Note that this is only an estimated range to help you decide your budget. diff --git a/website/docs/Use-Cases/Tune-User-Defined-Function.md b/website/docs/Use-Cases/Tune-User-Defined-Function.md new file mode 100644 index 0000000000..72568e20f5 --- /dev/null +++ b/website/docs/Use-Cases/Tune-User-Defined-Function.md @@ -0,0 +1,550 @@ +# Tune User Defined Function + +`flaml.tune` is a module for economical hyperparameter tuning. It is used internally by `flaml.AutoML`. It can also be used to directly tune a user-defined function (UDF), which is not limited to machine learning model training. You can use `flaml.tune` instead of `flaml.AutoML` if one of the following is true: + +1. Your machine learning task is not one of the built-in tasks from `flaml.AutoML`. +1. Your input cannot be represented as X_train + y_train or dataframe + label. +1. You want to tune a function that may not even be a machine learning procedure. + +## Basic Tuning Procedure + +There are three essential steps (assuming the knowledge of the set of hyperparameters to tune) to use `flaml.tune` to finish a basic tuning task: +1. Specify the [tuning objective](#tuning-objective) with respect to the hyperparameters. +1. Specify a [search space](#search-space) of the hyperparameters. +1. Specify [tuning constraints](#tuning-constraints), including constraints on the resource budget to do the tuning, constraints on the configurations, or/and constraints on a (or multiple) particular metric(s). + +With these steps, you can [perform a basic tuning task](#put-together) accordingly. + +### Tuning objective + +Related arguments: +- `evaluation_function`: A user-defined evaluation function. +- `metric`: A string of the metric name to optimize for. +- `mode`: A string in ['min', 'max'] to specify the objective as minimization or maximization. + +The first step is to specify your tuning objective. +To do it, you should first specify your evaluation procedure (e.g., perform a machine learning model training and validation) with respect to the hyperparameters in a user-defined function `evaluation_function`. +The function requires a hyperparameter configuration as input, and can simply return a metric value in a scalar or return a dictionary of metric name and metric value pairs. + +In the following code, we define an evaluation function with respect to two hyperparameters named `x` and `y` according to $obj := (x-85000)^2 - x/y$. Note that we use this toy example here for more accessible demonstration purposes. In real use cases, the evaluation function usually cannot be written in this closed form, but instead involves a black-box and expensive evaluation procedure. Please check out [Tune HuggingFace](../Examples/Tune-HuggingFace), [Tune PyTorch](../Examples/Tune-PyTorch) and [Tune LightGBM](../Getting-Started#tune-user-defined-function) for real examples of tuning tasks. + +```python +import time + +def evaluate_config(config: dict): + """evaluate a hyperparameter configuration""" + score = (config["x"] - 85000) ** 2 - config["x"] / config["y"] + # usually the evaluation takes an non-neglible cost + # and the cost could be related to certain hyperparameters + # here we simulate this cost by calling the time.sleep() function + # here we assume the cost is proportional to x + faked_evaluation_cost = config["x"] / 100000 + time.sleep(faked_evaluation_cost) + # we can return a single float as a score on the input config: + # return score + # or, we can return a dictionary that maps metric name to metric value: + return {"score": score, "evaluation_cost": faked_evaluation_cost, "constraint_metric": x * y} +``` + +When the evaluation function returns a dictionary of metrics, you need to specify the name of the metric to optimize via the argument `metric` (this can be skipped when the function is just returning a scalar). In addition, you need to specify a mode of your optimization/tuning task (maximization or minimization) via the argument `mode` by choosing from "min" or "max". + +For example, + +```python +flaml.tune.run(evaluation_function=evaluate_config, metric="score", mode="min", ...) +``` + +### Search space + +Related arguments: +- `config`: A dictionary to specify the search space. +- `low_cost_partial_config` (optional): A dictionary from a subset of controlled dimensions to the initial low-cost values. +- `cat_hp_cost` (optional): A dictionary from a subset of categorical dimensions to the relative cost of each choice. + +The second step is to specify a search space of the hyperparameters through the argument `config`. In the search space, you need to specify valid values for your hyperparameters and can specify how these values are sampled (e.g., from a uniform distribution or a log-uniform distribution). + +In the following code example, we include a search space for the two hyperparameters `x` and `y` as introduced above. The valid values for both are integers in the range of [1, 100000]. The values for `x` are sampled uniformly in the specified range (using `tune.randint(lower=1, upper=100000)`), and the values for `y` are sampled uniformly in logarithmic space of the specified range (using `tune.lograndit(lower=1, upper=100000)`). + + +```python +from flaml import tune + +# construct a search space for the hyperparameters x and y. +config_search_space = { + "x": tune.lograndint(lower=1, upper=100000), + "y": tune.randint(lower=1, upper=100000) +} + +# provide the search space to flaml.tune +flaml.tune.run(..., config=config_search_space, ...) +``` + +#### More details about the search space domain + +The corresponding value of a particular hyperparameter in the search space dictionary is called a domain, for example, `tune.randint(lower=1, upper=100000)` is the domain for the hyperparameter `y`. The domain specifies a type and valid range to sample parameters from. Supported types include float, integer, and categorical. You can also specify how to sample values from certain distributions in linear scale or log scale. +It is a common practice to sample in log scale if the valid value range is large and the evaluation function changes more regularly with respect to the log domain. +See the example below for the commonly used types of domains. + +```python +config = { + # Sample a float uniformly between -5.0 and -1.0 + "uniform": tune.uniform(-5, -1), + + # Sample a float uniformly between 3.2 and 5.4, + # rounding to increments of 0.2 + "quniform": tune.quniform(3.2, 5.4, 0.2), + + # Sample a float uniformly between 0.0001 and 0.01, while + # sampling in log space + "loguniform": tune.loguniform(1e-4, 1e-2), + + # Sample a float uniformly between 0.0001 and 0.1, while + # sampling in log space and rounding to increments of 0.00005 + "qloguniform": tune.qloguniform(1e-4, 1e-1, 5e-5), + + # Sample a random float from a normal distribution with + # mean=10 and sd=2 + "randn": tune.randn(10, 2), + + # Sample a random float from a normal distribution with + # mean=10 and sd=2, rounding to increments of 0.2 + "qrandn": tune.qrandn(10, 2, 0.2), + + # Sample a integer uniformly between -9 (inclusive) and 15 (exclusive) + "randint": tune.randint(-9, 15), + + # Sample a random uniformly between -21 (inclusive) and 12 (inclusive (!)) + # rounding to increments of 3 (includes 12) + "qrandint": tune.qrandint(-21, 12, 3), + + # Sample a integer uniformly between 1 (inclusive) and 10 (exclusive), + # while sampling in log space + "lograndint": tune.lograndint(1, 10), + + # Sample a integer uniformly between 1 (inclusive) and 10 (inclusive (!)), + # while sampling in log space and rounding to increments of 2 + "qlograndint": tune.qlograndint(1, 10, 2), + + # Sample an option uniformly from the specified choices + "choice": tune.choice(["a", "b", "c"]), +} +``` + + +#### Cost-related hyperparameters + +Cost-related hyperparameters are a subset of the hyperparameters which directly affect the computation cost incurred in the evaluation of any hyperparameter configuration. For example, the number of estimators (`n_estimators`) and the maximum number of leaves (`max_leaves`) are known to affect the training cost of tree-based learners. So they are cost-related hyperparameters for tree-based learners. + +When cost-related hyperparameters exist, the evaluation cost in the search space is heterogeneous. +In this case, designing a search space with proper ranges of the hyperparameter values is highly non-trivial. Classical tuning algorithms such as Bayesian optimization and random search are typically sensitive to such ranges. It may take them a very high cost to find a good choice if the ranges are too large. And if the ranges are too small, the optimal choice(s) may not be included and thus not possible to be found. With our method, you can use a search space with larger ranges in the case of heterogeneous cost. + +Our search algorithms are designed to finish the tuning process at a low total cost when the evaluation cost in the search space is heterogeneous. +So in such scenarios, if you are aware of low-cost configurations for the cost-related hyperparameters, you are encouraged to set them as the `low_cost_partial_config`, which is a dictionary of a subset of the hyperparameter coordinates whose value corresponds to a configuration with known low cost. Using the example of the tree-based methods again, since we know that small `n_estimators` and `max_leaves` generally correspond to simpler models and thus lower cost, we set `{'n_estimators': 4, 'max_leaves': 4}` as the `low_cost_partial_config` by default (note that 4 is the lower bound of search space for these two hyperparameters), e.g., in LGBM. Please find more details on how the algorithm works [here](#cfo-frugal-optimization-for-cost-related-hyperparameters). + + +In addition, if you are aware of the cost relationship between different categorical hyperparameter choices, you are encouraged to provide this information through `cat_hp_cost`. It also helps the search algorithm to reduce the total cost. + +### Tuning constraints + +Related arguments: +- `time_budget_s`: The time budget in seconds. +- `num_samples`: An integer of the number of configs to try. +- `config_constraints` (optional): A list of config constraints to be satisfied. +- `metric_constraints` (optional): A list of metric constraints to be satisfied. e.g., `['precision', '>=', 0.9]`. + +The third step is to specify constraints of the tuning task. One notable property of `flaml.tune` is that it is able to finish the tuning process (obtaining good results) within a required resource constraint. A user can either provide the resource constraint in terms of wall-clock time (in seconds) through the argument `time_budget_s`, or in terms of the number of trials through the argument `num_samples`. The following example shows three use cases: + +```python +# Set a resource constraint of 60 seconds wall-clock time for the tuning. +flaml.tune.run(..., time_budget_s=60, ...) + +# Set a resource constraint of 100 trials for the tuning. +flaml.tune.run(..., num_samples=100, ...) + +# Use at most 60 seconds and at most 100 trials for the tuning. +flaml.tune.run(..., time_budget_s=60, num_samples=100, ...) +``` + + +Optionally, you can provide a list of config constraints to be satisfied through the argument `config_constraints` and provide a list of metric constraints to be satisfied through the argument `metric_constraints`. We provide more details about related use cases in the [Advanced Tuning Options](#more-constraints-on-the-tuning) section. + + +### Put together +After the aforementioned key steps, one is ready to perform a tuning task by calling `flaml.tune.run()`. Below is a quick sequential tuning example using the pre-defined search space `config_search_space` and a minimization (`mode='min'`) objective for the `score` metric evaluated in `evaluate_config`, using the default serach algorithm in flaml. The time budget is 10 seconds (`time_budget_s=10`). +```python +# require: pip install flaml[blendsearch] +analysis = tune.run( + evaluate_config, # the function to evaluate a config + config=config_search_space, # the search space defined + metric="score", + mode="min", # the optimization mode, "min" or "max" + num_samples=-1, # the maximal number of configs to try, -1 means infinite + time_budget_s=10, # the time budget in seconds +) +``` + + +### Result analysis + +Once the tuning process finishes, it returns an [ExperimentAnalysis](../reference/tune/analysis) object, which provides methods to analyze the tuning. + +In the following code example, we retrieve the best configuration found during the tuning, and retrieve the best trial's result from the returned `analysis`. + +```python +analysis = tune.run( + evaluate_config, # the function to evaluate a config + config=config_search_space, # the search space defined + metric="score", + mode="min", # the optimization mode, "min" or "max" + num_samples=-1, # the maximal number of configs to try, -1 means infinite + time_budget_s=10, # the time budget in seconds +) +print(analysis.best_config) # the best config +print(analysis.best_trial.last_result) # the best trial's result +``` + +## Advanced Tuning Options + +There are several advanced tuning options worth mentioning. + +### More constraints on the tuning + +A user can specify constraints on the configurations to be satisfied via the argument `config_constraints`. The `config_constraints` receives a list of such constraints to be satisfied. Specifically, each constraint is a tuple that consists of (1) a function that takes a configuration as input and returns a numerical value; (2) an operation chosen from "<=" or ">"; (3) a numerical threshold. + +In the following code example, we constrain the output of `area`, which takes a configuration as input and outputs a numerical value, to be no larger than 1000. + +```python +def area(config): + return config["width"] * config["height"] + +flaml.tune.run(evaluation_function=evaluate_config, mode="min", + config=config_search_space, + config_constraints=[(area, "<=", 1000)], ...) +``` + + You can also specify a list of metric constraints to be satisfied via the argument `metric_constraints`. Each element in the `metric_constraints` list is a tuple that consists of (1) a string specifying the name of the metric (the metric name must be defined and returned in the user-defined `evaluation_function`); (2) an operation chosen from "<=" or ">"; (3) a numerical threshold. + + In the following code example, we constrain the metric `score` to be no larger than 0.4. + +```python +flaml.tune.run(evaluation_function=evaluate_config, mode="min", + config=config_search_space, + metric_constraints=[("score", "<=", 0.4)],...) +``` + +### Paralle tuning + +Related arguments: + +- `use_ray`: A boolean of whether to use ray as the backend. +- `resources_per_trial`: A dictionary of the hardware resources to allocate per trial, e.g., `{'cpu': 1}`. Only valid when using ray backend. + + +You can perform parallel tuning by specifying `use_ray=True` (requiring flaml[ray] option installed). You can also limit the amount of resources allocated per trial by specifying `resources_per_trial`, e.g., `resources_per_trial={'cpu': 2}`. + +```python +# require: pip install flaml[ray] +analysis = tune.run( + evaluate_config, # the function to evaluate a config + config=config_search_space, # the search space defined + metric="score", + mode="min", # the optimization mode, "min" or "max" + num_samples=-1, # the maximal number of configs to try, -1 means infinite + time_budget_s=10, # the time budget in seconds + use_ray=True, + resources_per_trial={"cpu": 2} # limit resources allocated per trial +) +print(analysis.best_trial.last_result) # the best trial's result +print(analysis.best_config) # the best config +``` + +**A headsup about computation overhead.** When parallel tuning is used, there will be a certain amount of computation overhead in each trial. In case each trial's original cost is much smaller than the overhead, parallel tuning can underperform sequential tuning. Sequential tuning is recommended when compute resource is limited, and each trial can consume all the resources. + + +### Trial scheduling + +Related arguments: +- `scheduler`: A scheduler for executing the trials. +- `resource_attr`: A string to specify the resource dimension used by the scheduler. +- `min_resource`: A float of the minimal resource to use for the resource_attr. +- `max_resource`: A float of the maximal resource to use for the resource_attr. +- `reduction_factor`: A float of the reduction factor used for incremental pruning. + +A scheduler can help manage the trials' execution. It can be used to perform multi-fiedlity evalution, or/and early stopping. You can use two different types of schedulers in `flaml.tune` via `scheduler`. + +#### 1. An authentic scheduler implemented in FLAML (`scheduler='flaml'`). + +This scheduler is authentic to the new search algorithms provided by FLAML. In a nutshell, it starts the search with the minimum resource. It switches between HPO with the current resource and increasing the resource for evaluation depending on which leads to faster improvement. + +If this scheduler is used, you need to +- Specify a resource dimension. Conceptually a 'resource dimension' is a factor that affects the cost of the evaluation (e.g., sample size, the number of epochs). You need to specify the name of the resource dimension via `resource_attr`. For example, if `resource_attr="sample_size"`, then the config dict passed to the `evaluation_function` would contain a key "sample_size" and its value suggested by the search algorithm. That value should be used in the evaluation function to control the compute cost. The larger is the value, the more expensive the evaluation is. + +- Provide the lower and upper limit of the resource dimension via `min_resource` and `max_resource`, and optionally provide `reduction_factor`, which determines the magnitude of resource (multiplicative) increase when we decide to increase the resource. + +In the following code example, we consider the sample size as the resource dimension. It determines how much data is used to perform training as reflected in the `evaluation_function`. We set the `min_resource` and `max_resource` to 1000 and the size of the full training dataset, respectively. + +```python +from flaml import tune +from functools import partial +from flaml.data import load_openml_task + +def obj_from_resource_attr(resource_attr, X_train, X_test, y_train, y_test, config): + from lightgbm import LGBMClassifier + from sklearn.metrics import accuracy_score + + # in this example sample size is our resource dimension + resource = int(config[resource_attr]) + sampled_X_train = X_train.iloc[:resource] + sampled_y_train = y_train[:resource] + + # construct a LGBM model from the config + # note that you need to first remove the resource_attr field + # from the config as it is not part of the original search space + model_config = config.copy() + del model_config[resource_attr] + model = LGBMClassifier(**model_config) + + model.fit(sampled_X_train, sampled_y_train) + y_test_predict = model.predict(X_test) + test_loss = 1.0 - accuracy_score(y_test, y_test_predict) + return {resource_attr: resource, "loss": test_loss} + +X_train, X_test, y_train, y_test = load_openml_task(task_id=7592, data_dir="test/") +max_resource = len(y_train) +resource_attr = "sample_size" +min_resource = 1000 +analysis = tune.run( + partial(obj_from_resource_attr, resource_attr, X_train, X_test, y_train, y_test), + config = { + "n_estimators": tune.lograndint(lower=4, upper=32768), + "max_leaves": tune.lograndint(lower=4, upper=32768), + "learning_rate": tune.loguniform(lower=1 / 1024, upper=1.0), + }, + metric="loss", + mode="min", + resource_attr=resource_attr, + scheduler="flaml", + max_resource=max_resource, + min_resource=min_resource, + reduction_factor=2, + time_budget_s=10, + num_samples=-1, +) +``` + +You can find more details about this scheduler in [this paper](https://arxiv.org/pdf/1911.04706.pdf). + + + +#### 2. A scheduler of the [`TrialScheduler`](https://docs.ray.io/en/latest/tune/api_docs/schedulers.html#tune-schedulers) class from `ray.tune`. + +There is a handful of schedulers of this type implemented in `ray.tune`, for example, [ASHA](https://docs.ray.io/en/latest/tune/api_docs/schedulers.html#asha-tune-schedulers-ashascheduler), [HyperBand](https://docs.ray.io/en/latest/tune/api_docs/schedulers.html#tune-original-hyperband), [BOHB](https://docs.ray.io/en/latest/tune/api_docs/schedulers.html#tune-scheduler-bohb), etc. + +To use this type of scheduler you can either (1) set `scheduler='asha'`, which will automatically create an [ASHAScheduler](https://docs.ray.io/en/latest/tune/api_docs/schedulers.html#asha-tune-schedulers-ashascheduler) instance using the provided inputs (`resource_attr`, `min_resource`, `max_resource`, and `reduction_factor`); or (2) create an instance by yourself and provided it via `scheduler`, as shown in the following code example, + +```python +# require: pip install flaml[ray] +from ray.tune.schedulers import HyperBandScheduler +my_scheduler = HyperBandScheduler(time_attr="sample_size", max_t=max_resource, reduction_factor=2) +tune.run(.., scheduler=my_scheduler, ...) +``` +- Similar to the case where the `flaml` scheduler is used, you need to specify the resource dimension, use the resource dimension accordingly in your `evaluation_function`, and provide the necessary information needed for scheduling, such as `min_resource`, `max_resource` and `reduction_factor` (depending on the requirements of the specific scheduler). + +- Different from the case when the `flaml` scheduler is used, the amount of resources to use at each iteration is not suggested by the search algorithm through the `resource_attr` in a configuration. You need to specify the evaluation schedule explicitly by yourself in the `evaluation_function` and report intermediate results (using `tune.report()`) accordingly. In the following code example, we use the ASHA scheduler by setting `scheduler="asha"`, we specify `resource_attr`, `min_resource`, `min_resource` and `reduction_factor` the same way as in the previous example (when "flaml" is used as the scheduler). We perform the evaluation in a customized schedule. + +```python +def obj_w_intermediate_report(resource_attr, X_train, X_test, y_train, y_test, min_resource, max_resource, config): + from lightgbm import LGBMClassifier + from sklearn.metrics import accuracy_score + + # a customized schedule to perform the evaluation + eval_schedule = [res for res in range(min_resource, max_resource, 5000)] + [max_resource] + for resource in eval_schedule: + sampled_X_train = X_train.iloc[:resource] + sampled_y_train = y_train[:resource] + + # construct a LGBM model from the config + model = LGBMClassifier(**config) + + model.fit(sampled_X_train, sampled_y_train) + y_test_predict = model.predict(X_test) + test_loss = 1.0 - accuracy_score(y_test, y_test_predict) + # need to report the resource attribute used and the corresponding intermediate results + tune.report(sample_size=resource, loss=test_loss) + +resource_attr = "sample_size" +min_resource = 1000 +max_resource = len(y_train) +analysis = tune.run( + partial(obj_w_intermediate_report, resource_attr, X_train, X_test, y_train, y_test, min_resource, max_resource), + config={ + "n_estimators": tune.lograndint(lower=4, upper=32768), + "learning_rate": tune.loguniform(lower=1 / 1024, upper=1.0), + }, + metric="loss", + mode="min", + resource_attr=resource_attr, + scheduler="asha", + max_resource=max_resource, + min_resource=min_resource, + reduction_factor=2, + time_budget_s=10, + num_samples = -1, +) +``` + +### Warm start + +Related arguments: + +- `points_to_evaluate`: A list of initial hyperparameter configurations to run first. +- `evaluated_rewards`: If you have previously evaluated the parameters passed in as `points_to_evaluate` , you can avoid re-running those trials by passing in the reward attributes as a list so the optimizer can be told the results without needing to re-compute the trial. Must be the same length as `points_to_evaluate`. + +If you are aware of some good hyperparameter configurations, you are encouraged to provide them via `points_to_evaluate`. The search algorithm will try them first and use them to bootstrap the search. + +You can use previously evaluated configurations to warm-start your tuning. +For example, the following code means that you know the reward for the two configs in +points_to_evaluate are 3.99 and 1.99, respectively, and want to +inform `tune.run()`. + +```python +def simple_obj(config): + return config["a"] + config["b"] + +from flaml import tune +config_search_space = { + "a": tune.uniform(lower=0, upper=0.99), + "b": tune.uniform(lower=0, upper=3) +} + +points_to_evaluate = [ + {"b": .99, "a": 3}, + {"b": .99, "a": 2}, +] +evaluated_rewards = [3.99, 2.99] + +analysis = tune.run( + simple_obj, + config=config_search_space, + mode="max", + points_to_evaluate=points_to_evaluate, + evaluated_rewards=evaluated_rewards, + time_budget_s=10, + num_samples=-1, +) +``` + +### Reproducibility + +By default, there is randomness in our tuning process. If reproducibility is desired, you could +manually set a random seed before calling `tune.run()`. For example, in the following code, we call `np.random.seed(100)` to set the random seed. +With this random seed, running the following code multiple times will generate exactly the same search trajectory. + +```python +import numpy as np +np.random.seed(100) +analysis = tune.run( + simple_obj, + config=config_search_space, + mode="max", + num_samples=10, +) +``` + + +## Hyperparameter Optimization Algorithm + +To tune the hyperparameters toward your objective, you will want to use a hyperparameter optimization algorithm which can help suggest hyperparameters with better performance (regarding your objective). `flaml` offers two HPO methods: CFO and BlendSearch. `flaml.tune` uses BlendSearch by default when the option [blendsearch] is installed. + + + +### CFO: Frugal Optimization for Cost-related Hyperparameters + +CFO uses the randomized direct search method FLOW2 with adaptive stepsize and random restart. +It requires a low-cost initial point as input if such point exists. +The search begins with the low-cost initial point and gradually move to +high cost region if needed. The local search method has a provable convergence +rate and bounded cost. + +About FLOW2: FLOW2 is a simple yet effective randomized direct search method. +It is an iterative optimization method that can optimize for black-box functions. +FLOW2 only requires pairwise comparisons between function values to perform iterative update. Comparing to existing HPO methods, FLOW2 has the following appealing properties: + +1. It is applicable to general black-box functions with a good convergence rate in terms of loss. +1. It provides theoretical guarantees on the total evaluation cost incurred. + +The GIFs attached below demonstrate an example search trajectory of FLOW2 shown in the loss and evaluation cost (i.e., the training time ) space respectively. FLOW2 is used in tuning the # of leaves and the # of trees for XGBoost. The two background heatmaps show the loss and cost distribution of all configurations. The black dots are the points evaluated in FLOW2. Black dots connected by lines are points that yield better loss performance when evaluated. + +![gif](images/heatmap_loss_cfo_12s.gif) | ![gif](images/heatmap_cost_cfo_12s.gif) +:---:|:---: + +From the demonstration, we can see that (1) FLOW2 can quickly move toward the low-loss region, showing good convergence property and (2) FLOW2 tends to avoid exploring the high-cost region until necessary. + +Example: + +```python +from flaml import CFO +tune.run(... + search_alg=CFO(low_cost_partial_config=low_cost_partial_config), +) +``` + +**Recommended scenario**: There exist cost-related hyperparameters and a low-cost +initial point is known before optimization. +If the search space is complex and CFO gets trapped into local optima, consider +using BlendSearch. + +### BlendSearch: Economical Hyperparameter Optimization With Blended Search Strategy + +BlendSearch combines local search with global search. It leverages the frugality +of CFO and the space exploration ability of global search methods such as +Bayesian optimization. Like CFO, BlendSearch requires a low-cost initial point +as input if such point exists, and starts the search from there. Different from +CFO, BlendSearch will not wait for the local search to fully converge before +trying new start points. The new start points are suggested by the global search +method and filtered based on their distance to the existing points in the +cost-related dimensions. BlendSearch still gradually increases the trial cost. +It prioritizes among the global search thread and multiple local search threads +based on optimism in face of uncertainty. + +Example: + +```python +# require: pip install flaml[blendsearch] +from flaml import BlendSearch +tune.run(... + search_alg=BlendSearch(low_cost_partial_config=low_cost_partial_config), +) +``` + +**Recommended scenario**: Cost-related hyperparameters exist, a low-cost +initial point is known, and the search space is complex such that local search +is prone to be stuck at local optima. + +**Suggestion about using larger search space in BlendSearch**. +In hyperparameter optimization, a larger search space is desirable because it is more likely to include the optimal configuration (or one of the optimal configurations) in hindsight. However the performance (especially anytime performance) of most existing HPO methods is undesirable if the cost of the configurations in the search space has a large variation. Thus hand-crafted small search spaces (with relatively homogeneous cost) are often used in practice for these methods, which is subject to idiosyncrasy. BlendSearch combines the benefits of local search and global search, which enables a smart (economical) way of deciding where to explore in the search space even though it is larger than necessary. This allows users to specify a larger search space in BlendSearch, which is often easier and a better practice than narrowing down the search space by hand. + +For more technical details, please check our papers. + +* [Frugal Optimization for Cost-related Hyperparameters](https://arxiv.org/abs/2005.01571). Qingyun Wu, Chi Wang, Silu Huang. AAAI 2021. + +```bibtex +@inproceedings{wu2021cfo, + title={Frugal Optimization for Cost-related Hyperparameters}, + author={Qingyun Wu and Chi Wang and Silu Huang}, + year={2021}, + booktitle={AAAI'21}, +} +``` + +* [Economical Hyperparameter Optimization With Blended Search Strategy](https://www.microsoft.com/en-us/research/publication/economical-hyperparameter-optimization-with-blended-search-strategy/). Chi Wang, Qingyun Wu, Silu Huang, Amin Saied. ICLR 2021. + +```bibtex +@inproceedings{wang2021blendsearch, + title={Economical Hyperparameter Optimization With Blended Search Strategy}, + author={Chi Wang and Qingyun Wu and Silu Huang and Amin Saied}, + year={2021}, + booktitle={ICLR'21}, +} +``` \ No newline at end of file diff --git a/docs/images/BlendSearch.png b/website/docs/Use-Cases/images/BlendSearch.png similarity index 100% rename from docs/images/BlendSearch.png rename to website/docs/Use-Cases/images/BlendSearch.png diff --git a/docs/images/CFO.png b/website/docs/Use-Cases/images/CFO.png similarity index 100% rename from docs/images/CFO.png rename to website/docs/Use-Cases/images/CFO.png diff --git a/website/docs/Use-Cases/images/curve.png b/website/docs/Use-Cases/images/curve.png new file mode 100644 index 0000000000..a421b0cd32 Binary files /dev/null and b/website/docs/Use-Cases/images/curve.png differ diff --git a/website/docs/Use-Cases/images/feature_importance.png b/website/docs/Use-Cases/images/feature_importance.png new file mode 100644 index 0000000000..3b1c361730 Binary files /dev/null and b/website/docs/Use-Cases/images/feature_importance.png differ diff --git a/docs/images/heatmap_cost_cfo_12s.gif b/website/docs/Use-Cases/images/heatmap_cost_cfo_12s.gif similarity index 100% rename from docs/images/heatmap_cost_cfo_12s.gif rename to website/docs/Use-Cases/images/heatmap_cost_cfo_12s.gif diff --git a/docs/images/heatmap_loss_cfo_12s.gif b/website/docs/Use-Cases/images/heatmap_loss_cfo_12s.gif similarity index 100% rename from docs/images/heatmap_loss_cfo_12s.gif rename to website/docs/Use-Cases/images/heatmap_loss_cfo_12s.gif diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 0000000000..7ae70fbe50 --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,134 @@ +/** @type {import('@docusaurus/types').DocusaurusConfig} */ +const math = require('remark-math'); +const katex = require('rehype-katex'); + +module.exports = { + title: 'FLAML', + tagline: 'A Fast Library for Automated Machine Learning & Tuning', + url: 'https://microsoft.github.io/', + baseUrl: '/FLAML/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + favicon: 'img/flaml_logo.ico', + organizationName: 'Microsoft', // Usually your GitHub org/user name. + projectName: 'FLAML', // Usually your repo name. + themeConfig: { + navbar: { + title: 'FLAML', + logo: { + alt: 'FLAML', + src: 'img/flaml_logo_fill.svg', + }, + items: [ + { + type: 'doc', + docId: 'Getting-Started', + position: 'left', + label: 'Docs', + }, + { + type: 'doc', + docId: 'reference/automl', + position: 'left', + label: 'SDK', + }, + { + type: 'doc', + docId: 'FAQ', + position: 'left', + label: 'FAQ', + }, + { + href: 'https://github.com/microsoft/FLAML', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + // { + // title: 'Docs', + // items: [ + // { + // label: 'Getting Started', + // to: 'docs/getting-started', + // }, + // ], + // }, + // { + // title: 'Community', + // items: [ + // // { + // // label: 'Stack Overflow', + // // href: 'https://stackoverflow.com/questions/tagged/pymarlin', + // // }, + // // { + // // label: 'Discord', + // // href: 'https://discordapp.com/invite/docusaurus', + // // }, + // // { + // // label: 'Twitter', + // // href: 'https://twitter.com/docusaurus', + // // }, + // ], + // }, + // { + // title: 'More', + // items: [ + // { + // label: 'GitHub', + // href: 'https://github.com/microsoft/FLAML', + // }, + // ], + // }, + ], + copyright: `Copyright © ${new Date().getFullYear()} FLAML Authors. Built with Docusaurus.`, + }, + }, + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + sidebarPath: require.resolve('./sidebars.js'), + // Please change this to your repo. + editUrl: + 'https://github.com/microsoft/FLAML/edit/master/website/', + remarkPlugins: [math], + rehypePlugins: [katex], + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }, + ], + ], + stylesheets: [ + { + href: "https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.css", + integrity: "sha384-Um5gpz1odJg5Z4HAmzPtgZKdTBHZdw8S29IecapCSB31ligYPhHQZMIlWLYQGVoc", + crossorigin: "anonymous", + }, + ], + + plugins: [ + // ... Your other plugins. + [ + require.resolve("@easyops-cn/docusaurus-search-local"), + { + // ... Your options. + // `hashed` is recommended as long-term-cache of index file is possible. + hashed: true, + blogDir:"./blog/" + // For Docs using Chinese, The `language` is recommended to set to: + // ``` + // language: ["en", "zh"], + // ``` + // When applying `zh` in language, please install `nodejieba` in your project. + }, + ], + ], +}; + diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000000..db8927eb3e --- /dev/null +++ b/website/package.json @@ -0,0 +1,44 @@ +{ + "name": "website", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "0.0.0-4193", + "@docusaurus/preset-classic": "0.0.0-4193", + "@easyops-cn/docusaurus-search-local": "^0.21.1", + "@mdx-js/react": "^1.6.21", + "@svgr/webpack": "^5.5.0", + "clsx": "^1.1.1", + "file-loader": "^6.2.0", + "hast-util-is-element": "1.1.0", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "rehype-katex": "4", + "remark-math": "3", + "trim": "^0.0.3", + "url-loader": "^4.1.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/website/pydoc-markdown.yml b/website/pydoc-markdown.yml new file mode 100644 index 0000000000..fa9ce6702f --- /dev/null +++ b/website/pydoc-markdown.yml @@ -0,0 +1,16 @@ +loaders: + - type: python + search_path: [../flaml/] +processors: + - type: filter + skip_empty_modules: true + - type: smart + - type: crossref +renderer: + type: docusaurus + docs_base_path: docs + relative_output_path: reference + relative_sidebar_path: sidebar.json + sidebar_top_level_label: Reference + markdown: + escape_html_in_docstring: false diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 0000000000..9d21a6ecf0 --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,23 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + + module.exports = { + docsSidebar: [ + 'Getting-Started', + 'Installation', + {'Use Cases': [{type: 'autogenerated', dirName: 'Use-Cases'}]}, + {'Examples': [{type: 'autogenerated', dirName: 'Examples'}]}, + 'Contribute', + 'Research', + ], + // pydoc-markdown auto-generated markdowns from docstrings + referenceSideBar: [require("./docs/reference/sidebar.json")] +}; diff --git a/website/src/components/HomepageFeatures.js b/website/src/components/HomepageFeatures.js new file mode 100644 index 0000000000..63e38b5701 --- /dev/null +++ b/website/src/components/HomepageFeatures.js @@ -0,0 +1,68 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './HomepageFeatures.module.css'; + +const FeatureList = [ + { + title: 'Find Quality Model at Your Fingertips', + Svg: require('../../static/img/auto.svg').default, + description: ( + <> + FLAML finds accurate ML models with low computational resources + for common ML tasks. + It frees users from selecting learners and hyperparameters. + {/* It is fast and economical. */} + + ), + }, + { + title: 'Easy to Customize or Extend', + Svg: require('../../static/img/extend.svg').default, + description: ( + <> + FLAML is designed easy to extend, such as adding custom learners or metrics. + The customization level ranges from minimal +(training data and task type as only input) to full (tuning a user-defined function). + + ), + }, + { + title: 'Tune It Fast, Tune It As You Like', + Svg: require('../../static/img/fast.svg').default, + description: ( + <> + FLAML offers a fast auto tuning tool powered by a novel cost-effective tuning approach. + It is capable of handling large search space with heterogeneous evaluation cost + and complex constraints/guidance/early stopping. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/website/src/components/HomepageFeatures.module.css b/website/src/components/HomepageFeatures.module.css new file mode 100644 index 0000000000..3f778709d7 --- /dev/null +++ b/website/src/components/HomepageFeatures.module.css @@ -0,0 +1,13 @@ +/* stylelint-disable docusaurus/copyright-header */ + +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 120px; + width: 200px; +} diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100644 index 0000000000..0f08b07492 --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,88 @@ +:root { + --ifm-font-size-base: 17px; + --ifm-code-font-size: 90%; + + --ifm-color-primary: #0c4da2; + --ifm-color-primary-dark: rgb(11, 69, 146); + --ifm-color-primary-darker: #0a418a; + --ifm-color-primary-darkest: #083671; + --ifm-color-primary-light: #0d55b2; + --ifm-color-primary-lighter: #0e59ba; + --ifm-color-primary-lightest: #1064d3; + + --ifm-color-emphasis-300: #1064d3; + --ifm-link-color: #1064d3; + --ifm-menu-color-active: #1064d3; +} + +.docusaurus-highlight-code-line { +background-color: rgba(0, 0, 0, 0.1); +display: block; +margin: 0 calc(-1 * var(--ifm-pre-padding)); +padding: 0 var(--ifm-pre-padding); +} +html[data-theme='dark'] .docusaurus-highlight-code-line { +background-color: rgb(0, 0, 0, 0.3); +} + +.admonition-content a { +text-decoration: underline; +font-weight: 600; +color: inherit; +} + +a { +font-weight: 600; +} + +blockquote { + /* samsung blue with lots of transparency */ + background-color: #0c4da224; +} +@media (prefers-color-scheme: dark) { +:root { + --ifm-hero-text-color: white; +} +} +@media (prefers-color-scheme: dark) { +.hero.hero--primary { --ifm-hero-text-color: white;} +} + +@media (prefers-color-scheme: dark) { +blockquote { + --ifm-color-emphasis-300: var(--ifm-color-primary); + /* border-left: 6px solid var(--ifm-color-emphasis-300); */ +} +} +@media (prefers-color-scheme: dark) { +code { + /* background-color: rgb(41, 45, 62); */ +} +} + + +/* Docusaurus still defaults to their green! */ +@media (prefers-color-scheme: dark) { +.react-toggle-thumb { + border-color: var(--ifm-color-primary) !important; +} +} + + +.header-github-link:hover { +opacity: 0.6; +} + +.header-github-link:before { +content: ''; +width: 24px; +height: 24px; +display: flex; +background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme='dark'] .header-github-link:before { +background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js new file mode 100644 index 0000000000..afd6094998 --- /dev/null +++ b/website/src/pages/index.js @@ -0,0 +1,40 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import styles from './index.module.css'; +import HomepageFeatures from '../components/HomepageFeatures'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + FLAML Getting Started - 5min ⏱️ + +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css new file mode 100644 index 0000000000..5c0d4f6e20 --- /dev/null +++ b/website/src/pages/index.module.css @@ -0,0 +1,25 @@ +/* stylelint-disable docusaurus/copyright-header */ + +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 966px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/website/static/.nojekyll b/website/static/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/images/FLAML.png b/website/static/img/FLAML.png similarity index 100% rename from docs/images/FLAML.png rename to website/static/img/FLAML.png diff --git a/website/static/img/auto.svg b/website/static/img/auto.svg new file mode 100644 index 0000000000..ed27ac7d0a --- /dev/null +++ b/website/static/img/auto.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/extend.svg b/website/static/img/extend.svg new file mode 100644 index 0000000000..572c995693 --- /dev/null +++ b/website/static/img/extend.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/fast.svg b/website/static/img/fast.svg new file mode 100644 index 0000000000..ad5fd96b00 --- /dev/null +++ b/website/static/img/fast.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/flaml_logo.ico b/website/static/img/flaml_logo.ico new file mode 100644 index 0000000000..e353db7c5e Binary files /dev/null and b/website/static/img/flaml_logo.ico differ diff --git a/website/static/img/flaml_logo_fill.svg b/website/static/img/flaml_logo_fill.svg new file mode 100644 index 0000000000..302ace08ab --- /dev/null +++ b/website/static/img/flaml_logo_fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/yarn.lock b/website/yarn.lock new file mode 100644 index 0000000000..0f6d4a5a05 --- /dev/null +++ b/website/yarn.lock @@ -0,0 +1,8107 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.5.0.tgz#6c91c9de7748e9c103846828a58dfe92bd4d6689" + integrity sha512-E7+VJwcvwMM8vPeaVn7fNUgix8WHV8A1WUeHDi2KHemCaaGc8lvUnP3QnvhMxiDhTe7OpMEv4o2TBUMyDgThaw== + dependencies: + "@algolia/autocomplete-shared" "1.5.0" + +"@algolia/autocomplete-preset-algolia@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.0.tgz#61671f09c0c77133d9baf1356719f8378c48437a" + integrity sha512-iiFxKERGHkvkiupmrFJbvESpP/zv5jSgH714XRiP5LDvUHaYOo4GLAwZCFf2ef/L5tdtPBARvekn6k1Xf33gjA== + dependencies: + "@algolia/autocomplete-shared" "1.5.0" + +"@algolia/autocomplete-shared@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.0.tgz#09580bc89408a2ab5f29e312120dad68f58019bd" + integrity sha512-bRSkqHHHSwZYbFY3w9hgMyQRm86Wz27bRaGCbNldLfbk0zUjApmE4ajx+ZCVSLqxvcUEjMqZFJzDsder12eKsg== + +"@algolia/cache-browser-local-storage@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.11.0.tgz#1c168add00b398a860db6c86039e33b2843a9425" + integrity sha512-4sr9vHIG1fVA9dONagdzhsI/6M5mjs/qOe2xUP0yBmwsTsuwiZq3+Xu6D3dsxsuFetcJgC6ydQoCW8b7fDJHYQ== + dependencies: + "@algolia/cache-common" "4.11.0" + +"@algolia/cache-common@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.11.0.tgz#066fe6d58b18e4b028dbef9bb8de07c5e22a3594" + integrity sha512-lODcJRuPXqf+6mp0h6bOxPMlbNoyn3VfjBVcQh70EDP0/xExZbkpecgHyyZK4kWg+evu+mmgvTK3GVHnet/xKw== + +"@algolia/cache-in-memory@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.11.0.tgz#763c8cb655e6fd2261588e04214fca0959ac07c1" + integrity sha512-aBz+stMSTBOBaBEQ43zJXz2DnwS7fL6dR0e2myehAgtfAWlWwLDHruc/98VOy1ZAcBk1blE2LCU02bT5HekGxQ== + dependencies: + "@algolia/cache-common" "4.11.0" + +"@algolia/client-account@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.11.0.tgz#67fadd3b0802b013ebaaa4b47bb7babae892374e" + integrity sha512-jwmFBoUSzoMwMqgD3PmzFJV/d19p1RJXB6C1ADz4ju4mU7rkaQLtqyZroQpheLoU5s5Tilmn/T8/0U2XLoJCRQ== + dependencies: + "@algolia/client-common" "4.11.0" + "@algolia/client-search" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/client-analytics@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.11.0.tgz#cbdc8128205e2da749cafc79e54708d14c413974" + integrity sha512-v5U9585aeEdYml7JqggHAj3E5CQ+jPwGVztPVhakBk8H/cmLyPS2g8wvmIbaEZCHmWn4TqFj3EBHVYxAl36fSA== + dependencies: + "@algolia/client-common" "4.11.0" + "@algolia/client-search" "4.11.0" + "@algolia/requester-common" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/client-common@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.11.0.tgz#9a2d1f6f8eaad25ba5d6d4ce307ba5bd84e6f999" + integrity sha512-Qy+F+TZq12kc7tgfC+FM3RvYH/Ati7sUiUv/LkvlxFwNwNPwWGoZO81AzVSareXT/ksDDrabD4mHbdTbBPTRmQ== + dependencies: + "@algolia/requester-common" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/client-personalization@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.11.0.tgz#d3bf0e760f85df876b4baf5b81996f0aa3a59940" + integrity sha512-mI+X5IKiijHAzf9fy8VSl/GTT67dzFDnJ0QAM8D9cMPevnfX4U72HRln3Mjd0xEaYUOGve8TK/fMg7d3Z5yG6g== + dependencies: + "@algolia/client-common" "4.11.0" + "@algolia/requester-common" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/client-search@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.11.0.tgz#c1105d715a2a04ba27231eca86f5d6620f68f4ae" + integrity sha512-iovPLc5YgiXBdw2qMhU65sINgo9umWbHFzInxoNErWnYoTQWfXsW6P54/NlKx5uscoLVjSf+5RUWwFu5BX+lpw== + dependencies: + "@algolia/client-common" "4.11.0" + "@algolia/requester-common" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/logger-common@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.11.0.tgz#bac1c2d59d29dee378b57412c8edd435b97de663" + integrity sha512-pRMJFeOY8hoWKIxWuGHIrqnEKN/kqKh7UilDffG/+PeEGxBuku+Wq5CfdTFG0C9ewUvn8mAJn5BhYA5k8y0Jqg== + +"@algolia/logger-console@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.11.0.tgz#ced19e3abb22eb782ed5268d51efb5aa9ef109ef" + integrity sha512-wXztMk0a3VbNmYP8Kpc+F7ekuvaqZmozM2eTLok0XIshpAeZ/NJDHDffXK2Pw+NF0wmHqurptLYwKoikjBYvhQ== + dependencies: + "@algolia/logger-common" "4.11.0" + +"@algolia/requester-browser-xhr@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.11.0.tgz#f9e1ad56f185432aa8dde8cad53ae271fd5d6181" + integrity sha512-Fp3SfDihAAFR8bllg8P5ouWi3+qpEVN5e7hrtVIYldKBOuI/qFv80Zv/3/AMKNJQRYglS4zWyPuqrXm58nz6KA== + dependencies: + "@algolia/requester-common" "4.11.0" + +"@algolia/requester-common@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.11.0.tgz#d16de98d3ff72434bac39e4d915eab08035946a9" + integrity sha512-+cZGe/9fuYgGuxjaBC+xTGBkK7OIYdfapxhfvEf03dviLMPmhmVYFJtJlzAjQ2YmGDJpHrGgAYj3i/fbs8yhiA== + +"@algolia/requester-node-http@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.11.0.tgz#beb2b6b68d5f4ce15aec80ede623f0ac96991368" + integrity sha512-qJIk9SHRFkKDi6dMT9hba8X1J1z92T5AZIgl+tsApjTGIRQXJLTIm+0q4yOefokfu4CoxYwRZ9QAq+ouGwfeOg== + dependencies: + "@algolia/requester-common" "4.11.0" + +"@algolia/transporter@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.11.0.tgz#a8de3c173093ceceb02b26b577395ce3b3d4b96f" + integrity sha512-k4dyxiaEfYpw4UqybK9q7lrFzehygo6KV3OCYJMMdX0IMWV0m4DXdU27c1zYRYtthaFYaBzGF4Kjcl8p8vxCKw== + dependencies: + "@algolia/cache-common" "4.11.0" + "@algolia/logger-common" "4.11.0" + "@algolia/requester-common" "4.11.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.12.16", "@babel/core@^7.12.3", "@babel/core@^7.15.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.12.15", "@babel/generator@^7.12.5", "@babel/generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@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.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" + integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" + +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.16", "@babel/parser@^7.12.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": + version "7.16.2" + 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.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + +"@babel/plugin-proposal-async-generator-functions@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" + integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" + integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" + integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@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-class-properties@^7.12.13": + 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-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-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.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" + integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + 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": + 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", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@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": + 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.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" + integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" + +"@babel/plugin-transform-block-scoped-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== + dependencies: + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.15.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + +"@babel/plugin-transform-new-target@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" + integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-constant-elements@^7.12.1", "@babel/plugin-transform-react-constant-elements@^7.14.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.0.tgz#1483b894b8e6ef0709d260532fbd4db9fc27a0e6" + integrity sha512-OgtklS+p9t1X37eWA4XdvvbZG/3gqzX569gqmo3q4/Ui6qjfTQmOs5UTSrfdD9nVByHhX6Gbm/Pyc4KbwUXGWA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-display-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz#9a0ad8aa8e8790883a7bd2736f66229a58125676" + integrity sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-jsx-development@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz#1cb52874678d23ab11d0d16488d54730807303ef" + integrity sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.0" + +"@babel/plugin-transform-react-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1" + integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/plugin-transform-react-pure-annotations@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz#23db6ddf558d8abde41b8ad9d59f48ad5532ccab" + integrity sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@^7.15.0": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz#f9ba3c7034d429c581e1bd41b4952f3db3c2c7e8" + integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typescript@^7.16.0": + version "7.16.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" + integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.16.0" + +"@babel/plugin-transform-unicode-escapes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.15.6": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3" + integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.3" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.4" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-class-static-block" "^7.16.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.0" + "@babel/plugin-proposal-export-namespace-from" "^7.16.0" + "@babel/plugin-proposal-json-strings" "^7.16.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-proposal-private-property-in-object" "^7.16.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-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-transform-arrow-functions" "^7.16.0" + "@babel/plugin-transform-async-to-generator" "^7.16.0" + "@babel/plugin-transform-block-scoped-functions" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-classes" "^7.16.0" + "@babel/plugin-transform-computed-properties" "^7.16.0" + "@babel/plugin-transform-destructuring" "^7.16.0" + "@babel/plugin-transform-dotall-regex" "^7.16.0" + "@babel/plugin-transform-duplicate-keys" "^7.16.0" + "@babel/plugin-transform-exponentiation-operator" "^7.16.0" + "@babel/plugin-transform-for-of" "^7.16.0" + "@babel/plugin-transform-function-name" "^7.16.0" + "@babel/plugin-transform-literals" "^7.16.0" + "@babel/plugin-transform-member-expression-literals" "^7.16.0" + "@babel/plugin-transform-modules-amd" "^7.16.0" + "@babel/plugin-transform-modules-commonjs" "^7.16.0" + "@babel/plugin-transform-modules-systemjs" "^7.16.0" + "@babel/plugin-transform-modules-umd" "^7.16.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" + "@babel/plugin-transform-new-target" "^7.16.0" + "@babel/plugin-transform-object-super" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.3" + "@babel/plugin-transform-property-literals" "^7.16.0" + "@babel/plugin-transform-regenerator" "^7.16.0" + "@babel/plugin-transform-reserved-words" "^7.16.0" + "@babel/plugin-transform-shorthand-properties" "^7.16.0" + "@babel/plugin-transform-spread" "^7.16.0" + "@babel/plugin-transform-sticky-regex" "^7.16.0" + "@babel/plugin-transform-template-literals" "^7.16.0" + "@babel/plugin-transform-typeof-symbol" "^7.16.0" + "@babel/plugin-transform-unicode-escapes" "^7.16.0" + "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.19.1" + 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.13", "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.14.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.0.tgz#f71d3e8dff5218478011df037fad52660ee6d82a" + integrity sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-react-jsx" "^7.16.0" + "@babel/plugin-transform-react-jsx-development" "^7.16.0" + "@babel/plugin-transform-react-pure-annotations" "^7.16.0" + +"@babel/preset-typescript@^7.12.16", "@babel/preset-typescript@^7.15.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" + integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.16.0" + +"@babel/runtime-corejs3@^7.15.4": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz#1e25de4fa994c57c18e5fdda6cc810dac70f5590" + integrity sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ== + dependencies: + core-js-pure "^3.19.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.15.4", "@babel/runtime@^7.8.4": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" + integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.12.7", "@babel/template@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.3" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.6", "@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + +"@docsearch/css@3.0.0-alpha.42": + version "3.0.0-alpha.42" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0-alpha.42.tgz#deb6049e999d6ca9451eba4793cb5b6da28c8773" + integrity sha512-AGwI2AXUacYhVOHmYnsXoYDJKO6Ued2W+QO80GERbMLhC7GH5tfvtW5REs/s7jSdcU3vzFoxT8iPDBCh/PkrlQ== + +"@docsearch/react@^3.0.0-alpha.39": + version "3.0.0-alpha.42" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0-alpha.42.tgz#1d22a2b05779f24d090ff8d7ff2699e4d50dff5c" + integrity sha512-1aOslZJDxwUUcm2QRNmlEePUgL8P5fOAeFdOLDMctHQkV2iTja9/rKVbkP8FZbIUnZxuuCCn8ErLrjD/oXWOag== + dependencies: + "@algolia/autocomplete-core" "1.5.0" + "@algolia/autocomplete-preset-algolia" "1.5.0" + "@docsearch/css" "3.0.0-alpha.42" + algoliasearch "^4.0.0" + +"@docusaurus/core@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-0.0.0-4193.tgz#1fe5ac8ab7b062411dd8e413617cc9a1e4c4d15c" + integrity sha512-mC3YLaFgK8JqW3E7b2lCtIlQOVnzqOP0FwtI0+ilkx9v9F+DfgNQzJJ7Kk2RIXeDKu0e2AnjS7YBmRUwpgHRRg== + dependencies: + "@babel/core" "^7.12.16" + "@babel/generator" "^7.12.15" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.15.0" + "@babel/preset-env" "^7.15.6" + "@babel/preset-react" "^7.12.13" + "@babel/preset-typescript" "^7.12.16" + "@babel/runtime" "^7.15.4" + "@babel/runtime-corejs3" "^7.15.4" + "@babel/traverse" "^7.12.13" + "@docusaurus/cssnano-preset" "0.0.0-4193" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + "@docusaurus/utils-common" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + "@slorber/static-site-generator-webpack-plugin" "^4.0.0" + "@svgr/webpack" "^5.5.0" + autoprefixer "^10.3.5" + babel-loader "^8.2.2" + babel-plugin-dynamic-import-node "2.3.0" + boxen "^5.0.1" + chalk "^4.1.2" + chokidar "^3.5.2" + clean-css "^5.1.5" + commander "^5.1.0" + copy-webpack-plugin "^9.0.1" + core-js "^3.18.0" + css-loader "^5.1.1" + css-minimizer-webpack-plugin "^3.0.2" + cssnano "^5.0.8" + del "^6.0.0" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^1.12.3" + file-loader "^6.2.0" + fs-extra "^10.0.0" + github-slugger "^1.4.0" + globby "^11.0.2" + html-minifier-terser "^6.0.2" + html-tags "^3.1.0" + html-webpack-plugin "^5.4.0" + import-fresh "^3.3.0" + is-root "^2.1.0" + leven "^3.1.0" + lodash "^4.17.20" + mini-css-extract-plugin "^1.6.0" + nprogress "^0.2.0" + postcss "^8.3.7" + postcss-loader "^6.1.1" + prompts "^2.4.1" + react-dev-utils "12.0.0-next.47" + react-error-overlay "^6.0.9" + react-helmet "^6.1.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.2.0" + react-router-config "^5.1.1" + react-router-dom "^5.2.0" + remark-admonitions "^1.2.1" + resolve-pathname "^3.0.0" + rtl-detect "^1.0.4" + semver "^7.3.4" + serve-handler "^6.1.3" + shelljs "^0.8.4" + std-env "^2.2.1" + strip-ansi "^6.0.0" + terser-webpack-plugin "^5.2.4" + tslib "^2.3.1" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.0" + webpack "^5.61.0" + webpack-bundle-analyzer "^4.4.2" + webpack-dev-server "^4.4.0" + webpack-merge "^5.8.0" + webpackbar "^5.0.0-3" + +"@docusaurus/cssnano-preset@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-0.0.0-4193.tgz#94fe5fbccf976e67781876dafe1e9d7d3cb77ae6" + integrity sha512-aB8JNvHU/BW6YnBk7p9HljTOp0DIIVbeCa4WCS3Brp8U6MfM1XlMLqcBUWcCXl4dnvNGhIPKdCDToTdKm0M2MA== + dependencies: + cssnano-preset-advanced "^5.1.4" + postcss "^8.3.7" + postcss-sort-media-queries "^4.1.0" + +"@docusaurus/mdx-loader@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-0.0.0-4193.tgz#b43a00cd71f365a1ada793e613bab994dc105868" + integrity sha512-EN/Q/GDMirYsxdQ+ElhqWCfKQer2MQNrmKUYc+e+4lZeAUDT9E6M7HinGoImtYQbZpN5uSjDnzTYP793DGsMjQ== + dependencies: + "@babel/parser" "^7.12.16" + "@babel/traverse" "^7.12.13" + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + "@mdx-js/mdx" "^1.6.21" + "@mdx-js/react" "^1.6.21" + chalk "^4.1.2" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.0.0" + github-slugger "^1.4.0" + gray-matter "^4.0.3" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.1.0" + stringify-object "^3.3.0" + unist-util-visit "^2.0.2" + url-loader "^4.1.1" + webpack "^5.61.0" + +"@docusaurus/plugin-content-blog@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-0.0.0-4193.tgz#3868117e9cbed96ef74286ece3af93ecf73eae0f" + integrity sha512-5GLRK3ftr1QmcBEQokn7frauAh6g9Jsc3tQUeMUR2iWZk7C96rAfVMrY3W5Jv+6gfgGzbTG+AKAUD9e3gcGHfg== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/mdx-loader" "0.0.0-4193" + "@docusaurus/types" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + chalk "^4.1.2" + escape-string-regexp "^4.0.0" + feed "^4.2.2" + fs-extra "^10.0.0" + globby "^11.0.2" + js-yaml "^4.0.0" + loader-utils "^2.0.0" + lodash "^4.17.20" + reading-time "^1.5.0" + remark-admonitions "^1.2.1" + tslib "^2.3.1" + utility-types "^3.10.0" + webpack "^5.61.0" + +"@docusaurus/plugin-content-docs@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-0.0.0-4193.tgz#e22cac31dccd9dc763303bc2ec4b32c718babf6c" + integrity sha512-UDccCvOk/vIKtbLwkWz8oI8SWrJXmKrkI1IKO038EfcJT2OAA/Gy96jar659Z2c1bqS9QurJ5M2RHA3JBS6xrg== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/mdx-loader" "0.0.0-4193" + "@docusaurus/types" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + chalk "^4.1.2" + combine-promises "^1.1.0" + escape-string-regexp "^4.0.0" + fs-extra "^10.0.0" + globby "^11.0.2" + import-fresh "^3.2.2" + js-yaml "^4.0.0" + loader-utils "^2.0.0" + lodash "^4.17.20" + remark-admonitions "^1.2.1" + shelljs "^0.8.4" + tslib "^2.3.1" + utility-types "^3.10.0" + webpack "^5.61.0" + +"@docusaurus/plugin-content-pages@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-0.0.0-4193.tgz#84fdbb23e49f974ed2bbd6b2d88acbc77f305daa" + integrity sha512-E/vP3vGGEWtswFbUco+5elM5O/vch6vB1Lq5Zwq6ybtumalF1kXa67ZN8dlMspI4nhAPv45ZTZPT8UlRLrlqaQ== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/mdx-loader" "0.0.0-4193" + "@docusaurus/types" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + globby "^11.0.2" + lodash "^4.17.20" + remark-admonitions "^1.2.1" + tslib "^2.3.1" + webpack "^5.61.0" + +"@docusaurus/plugin-debug@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-0.0.0-4193.tgz#2719e82483ee3fae33641262d67d59d97efab405" + integrity sha512-3+rkYliCSVKNaRR/AXatbk4xpvIax7VtEtjGBTz7T6lxo8CujqOcw+j8R2HxlQSC0PgmkKnTLMDP1umZuqnIHg== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/types" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + fs-extra "^10.0.0" + react-json-view "^1.21.3" + tslib "^2.3.1" + +"@docusaurus/plugin-google-analytics@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-0.0.0-4193.tgz#feb41af7f18b400c483331fd239bb0a677358853" + integrity sha512-wWZbr3nSFh7hEWTCmef3eih5S1s4z5+jJTCCZsq+gkHK4b9V9u81BvESB4N7T6dxt9vNEKIoYEb58iuYzUkLbw== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + +"@docusaurus/plugin-google-gtag@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-0.0.0-4193.tgz#8a1ba67649a30cdae512c5daae723b50a8247d21" + integrity sha512-k7JYw7PvfarFJLDUcSOSzb3MTOL5/yi6ZIs3mTBpAaC7U+MTGVLVejVuoMKAprbtAg2RUZq5unGnBoji7xaDyQ== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + +"@docusaurus/plugin-sitemap@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-0.0.0-4193.tgz#9e2a806b2263fa40e90fa61439738709232b0942" + integrity sha512-819ln3gj/ozT/BioQl2OrOcRvj5hvxta7h0m7TW/UbAZVx6X9QNAN9TZd49dyuTF/7y3JswU/7BxbeeOT6c/4Q== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/types" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + "@docusaurus/utils-common" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + fs-extra "^10.0.0" + sitemap "^7.0.0" + tslib "^2.3.1" + +"@docusaurus/preset-classic@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-0.0.0-4193.tgz#ebd5a074fe3fff7e5bb2f42d7edf580941500849" + integrity sha512-R4hGzXQvCXVeH6+AbgnXBNoNagZ9Wc3WikS/MUAuu5F1vY44U2nFZo6rCDeJgupAGdqjIicA10acSUVTMslbXw== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/plugin-content-blog" "0.0.0-4193" + "@docusaurus/plugin-content-docs" "0.0.0-4193" + "@docusaurus/plugin-content-pages" "0.0.0-4193" + "@docusaurus/plugin-debug" "0.0.0-4193" + "@docusaurus/plugin-google-analytics" "0.0.0-4193" + "@docusaurus/plugin-google-gtag" "0.0.0-4193" + "@docusaurus/plugin-sitemap" "0.0.0-4193" + "@docusaurus/theme-classic" "0.0.0-4193" + "@docusaurus/theme-search-algolia" "0.0.0-4193" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-0.0.0-4193.tgz#416cf10789cc9e5ccf340287eaadcffe538b16d5" + integrity sha512-jPu5EkknsnqAyFNV5AYtM9+GOfZ3l3rVJYiGRNy/v/VvmBTqoWUVXm8Xylf79yMFEOjlGgFObfR58IPThZvvXw== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/plugin-content-blog" "0.0.0-4193" + "@docusaurus/plugin-content-docs" "0.0.0-4193" + "@docusaurus/plugin-content-pages" "0.0.0-4193" + "@docusaurus/theme-common" "0.0.0-4193" + "@docusaurus/types" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + "@mdx-js/mdx" "^1.6.21" + "@mdx-js/react" "^1.6.21" + chalk "^4.1.2" + clsx "^1.1.1" + copy-text-to-clipboard "^3.0.1" + fs-extra "^10.0.0" + globby "^11.0.2" + infima "0.2.0-alpha.34" + lodash "^4.17.20" + postcss "^8.3.7" + prism-react-renderer "^1.2.1" + prismjs "^1.23.0" + prop-types "^15.7.2" + react-router-dom "^5.2.0" + rtlcss "^3.3.0" + +"@docusaurus/theme-common@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-0.0.0-4193.tgz#73f6cfa73c868cf03b6cb5d15084bb05616034b5" + integrity sha512-6yJEVlKrm9KIgMo1pmsAA5EL7FcrpeMPfkwhChAH0W5s6i4aQENrefQcEXBBBIv1KbNx4uNUG779plvnoSfNWA== + dependencies: + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/plugin-content-blog" "0.0.0-4193" + "@docusaurus/plugin-content-docs" "0.0.0-4193" + "@docusaurus/plugin-content-pages" "0.0.0-4193" + "@docusaurus/types" "0.0.0-4193" + clsx "^1.1.1" + fs-extra "^10.0.0" + parse-numeric-range "^1.3.0" + tslib "^2.3.1" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-0.0.0-4193.tgz#35bb8940c33d4d3c3dcaff7ea2f16344289abf81" + integrity sha512-we2Z7nhZy5bgoYqF8ZXJO2jt8rBsqnDgXoRPkzoaacQww3CO3+Ez9Q+Dcpxy7lunNY3fShv+9SC13K9yClCUEQ== + dependencies: + "@docsearch/react" "^3.0.0-alpha.39" + "@docusaurus/core" "0.0.0-4193" + "@docusaurus/theme-common" "0.0.0-4193" + "@docusaurus/utils" "0.0.0-4193" + "@docusaurus/utils-validation" "0.0.0-4193" + algoliasearch "^4.10.5" + algoliasearch-helper "^3.5.5" + clsx "^1.1.1" + eta "^1.12.3" + lodash "^4.17.20" + +"@docusaurus/types@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-0.0.0-4193.tgz#6f1b9430ff27b40cb32892074934491363e6b8c5" + integrity sha512-2y+D3yYzEbBAmK74Me4g3pVe1sSRXZDDyKzf/Ojb729F7lYx9dvUTj0I/YlNDcPg5FUKCorfnV+3RfsyDb8lKA== + dependencies: + commander "^5.1.0" + joi "^17.4.2" + querystring "0.2.0" + utility-types "^3.10.0" + webpack "^5.61.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-0.0.0-4193.tgz#2631c645e5b6e3b8fb799d80ed032f6a8e2842d6" + integrity sha512-31kHFbhubA8cKZIjztNBsIUBbD+gHInHfVuvzBdcOnZgFfTdL9sUrROmjGnAAopAoJ/YyO5bsu5GGnrn/hexDA== + dependencies: + "@docusaurus/types" "0.0.0-4193" + tslib "^2.3.1" + +"@docusaurus/utils-validation@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-0.0.0-4193.tgz#96f7af723a971411635c5c51a38c391bd9699523" + integrity sha512-ppVmx3KOHKyxta51O76VAVLttR46ItigEVpbaw5nfxs8muGKXmddWQ2lA78ga1zTDzwLT/7d18kngn46Qva+dw== + dependencies: + "@docusaurus/utils" "0.0.0-4193" + chalk "^4.1.2" + joi "^17.4.2" + tslib "^2.3.1" + +"@docusaurus/utils-validation@^2.0.0-beta.4": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.13.tgz#3ec823a9587f1163e679f7d284277a5b912ea4da" + integrity sha512-2ucoqiFKQURCmqxRN3uYwper/uEWiY0auMRMt0RnhgRZlY3460IoPMjs5ewyjWAP7huRMhNz/FMmNUheKEK06w== + dependencies: + "@docusaurus/utils" "2.0.0-beta.13" + chalk "^4.1.2" + joi "^17.4.2" + tslib "^2.3.1" + +"@docusaurus/utils@0.0.0-4193": + version "0.0.0-4193" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-0.0.0-4193.tgz#cf4e7367cf926bf2ac8e3039088d60a49537e4e3" + integrity sha512-c+1c735JzKqE2pRAkHnKyz81a6RE5HcVL3J1tpw9ACKjMyDq1qv3XeYa/ZKv/09qi/FI2QiZ32eiYHMXNZE1Sw== + dependencies: + "@docusaurus/types" "0.0.0-4193" + "@mdx-js/runtime" "^1.6.22" + "@types/github-slugger" "^1.3.0" + chalk "^4.1.2" + escape-string-regexp "^4.0.0" + fs-extra "^10.0.0" + globby "^11.0.4" + gray-matter "^4.0.3" + lodash "^4.17.20" + micromatch "^4.0.4" + remark-mdx-remove-exports "^1.6.22" + remark-mdx-remove-imports "^1.6.22" + resolve-pathname "^3.0.0" + tslib "^2.3.1" + +"@docusaurus/utils@2.0.0-beta.13", "@docusaurus/utils@^2.0.0-beta.4": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-beta.13.tgz#aac3d7732593969cacfca29675c490b0309dc324" + integrity sha512-jvQynP//qwqwD8tvCdCH6a9QMc8XQwC6nJsU3pu6+dvU9STVrriBH4RmrQSL4orPFdJ46sBjQEH7DD3sYvv9fw== + dependencies: + "@mdx-js/runtime" "^1.6.22" + "@svgr/webpack" "^6.0.0" + chalk "^4.1.2" + escape-string-regexp "^4.0.0" + file-loader "^6.2.0" + fs-extra "^10.0.0" + github-slugger "^1.4.0" + globby "^11.0.4" + gray-matter "^4.0.3" + lodash "^4.17.20" + micromatch "^4.0.4" + remark-mdx-remove-exports "^1.6.22" + remark-mdx-remove-imports "^1.6.22" + resolve-pathname "^3.0.0" + tslib "^2.3.1" + url-loader "^4.1.1" + +"@easyops-cn/autocomplete.js@^0.38.1": + version "0.38.1" + resolved "https://registry.yarnpkg.com/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz#46dff5795a9a032fa9b9250fdf63ca6c61c07629" + integrity sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q== + dependencies: + cssesc "^3.0.0" + immediate "^3.2.3" + +"@easyops-cn/docusaurus-search-local@^0.21.1": + version "0.21.1" + resolved "https://registry.yarnpkg.com/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.21.1.tgz#620c36c3e658fb5ee8548fb3fbc05e668e931c18" + integrity sha512-qs3oPRjTik0TvMSBpEabd4dr0/FzaObuL4T19ZdMQiyBhsH3gNFVxhg1pUVQ6uXmM7KkRQgDRfgAjqCGlKCN2w== + dependencies: + "@docusaurus/utils" "^2.0.0-beta.4" + "@docusaurus/utils-validation" "^2.0.0-beta.4" + "@easyops-cn/autocomplete.js" "^0.38.1" + cheerio "^1.0.0-rc.3" + clsx "^1.1.1" + debug "^4.2.0" + fs-extra "^9.0.1" + klaw-sync "^6.0.0" + lunr "^2.3.9" + lunr-languages "^1.4.0" + mark.js "^8.11.1" + tslib "^2.2.0" + +"@hapi/hoek@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@mdx-js/mdx@1.6.22", "@mdx-js/mdx@^1.6.21": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@1.6.22", "@mdx-js/react@^1.6.21": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/runtime@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/runtime/-/runtime-1.6.22.tgz#3edd388bf68a519ffa1aaf9c446b548165102345" + integrity sha512-p17spaO2+55VLCuxXA3LVHC4phRx60NR2XMdZ+qgVU1lKvEX4y88dmFNOzGDCPLJ03IZyKrJ/rPWWRiBrd9JrQ== + dependencies: + "@mdx-js/mdx" "1.6.22" + "@mdx-js/react" "1.6.22" + buble-jsx-only "^0.19.8" + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@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": + 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" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@sideway/address@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.3.tgz#d93cce5d45c5daec92ad76db492cc2ee3c64ab27" + integrity sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@slorber/static-site-generator-webpack-plugin@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.1.tgz#0c8852146441aaa683693deaa5aee2f991d94841" + integrity sha512-PSv4RIVO1Y3kvHxjvqeVisk3E9XFoO04uwYBDWe217MFqKspplYswTuKLiJu0aLORQWzuQjfVsSlLPojwfYsLw== + dependencies: + bluebird "^3.7.1" + cheerio "^0.22.0" + eval "^0.1.4" + url "^0.11.0" + webpack-sources "^1.4.3" + +"@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-add-jsx-attribute@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz#bd6d1ff32a31b82b601e73672a789cc41e84fe18" + integrity sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA== + +"@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-attribute@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz#58654908beebfa069681a83332544b17e5237e89" + integrity sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw== + +"@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-remove-jsx-empty-expression@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz#d06dd6e8a8f603f92f9979bb9990a1f85a4f57ba" + integrity sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA== + +"@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-replace-jsx-attribute-value@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz#0b85837577b02c31c09c758a12932820f5245cee" + integrity sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ== + +"@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-dynamic-title@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz#28236ec26f7ab9d486a487d36ae52d58ba15676f" + integrity sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg== + +"@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-svg-em-dimensions@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz#40267c5dea1b43c4f83a0eb6169e08b43d8bafce" + integrity sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA== + +"@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-react-native-svg@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz#eb688d0a5f539e34d268d8a516e81f5d7fede7c9" + integrity sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ== + +"@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-plugin-transform-svg-component@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.1.0.tgz#39f92954f7611c269a4ca6906d19e66cdc12babe" + integrity sha512-1zacrn08K5RyV2NtXahOZ5Im/+aB1Y0LVh6QpzwgQV05sY7H5Npq+OcW/UqXbfB2Ua/WnHsFossFQqigCjarYg== + +"@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/babel-preset@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.1.0.tgz#b8a6b0019537bcd75b3e23fd33c180476c1ef446" + integrity sha512-f9XrTqcwhHLVkjvXBw6QJVxuIfmW22z8iTdGqGvUGGxWoeRV2EzSHstWMBgIVd7t+TmkerqowRvBYiT0OEx3cw== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^6.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "^6.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "^6.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0" + "@svgr/babel-plugin-transform-svg-component" "^6.1.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/core@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.1.1.tgz#04a7c0ce9fab2f8671ab1d99199778cc869091b6" + integrity sha512-/NP+24cQmcEdJYptoFWO34SHkNx2x4KOGAMcnTpzOPQifvb1ecupWNEPeHBDY18utd0OMpl2kWf0ZnyN5VsVlg== + dependencies: + "@svgr/plugin-jsx" "^6.1.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@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/hast-util-to-babel-ast@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.0.0.tgz#423329ad866b6c169009cc82b5e28ffee80c857c" + integrity sha512-S+TxtCdDyRGafH1VG1t/uPZ87aOYOHzWL8kqz4FoSZcIbzWA6rnOmjNViNiDzqmEpzp2PW5o5mZfvC9DiVZhTQ== + dependencies: + "@babel/types" "^7.15.6" + entities "^3.0.1" + +"@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-jsx@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.1.0.tgz#2ba2d3cbb02d4f6e988fdfe5615baa04b8d0524b" + integrity sha512-grAeVnwjr4eyzzscX6d5dK202nQcKGt5STry3BrCNuw8RZkMVFYumjH/qLnInO2ugc0ESSo8eCkb+30vXVxSTg== + dependencies: + "@babel/core" "^7.15.5" + "@svgr/babel-preset" "^6.1.0" + "@svgr/hast-util-to-babel-ast" "^6.0.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/plugin-svgo@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.1.0.tgz#30af6b64326a2c104c493de7c9b3ddda266c4e2e" + integrity sha512-NQtYlvPg6yk3wxm1EeeI3kNh/NoSxwW/Zjkvy3vf4CJJHKryB3TnkLsY8Z5hDOERT3Hadksh9RyZnSszEG7q5w== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.5.0" + +"@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" + +"@svgr/webpack@^6.0.0": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.1.1.tgz#73b64f545f1f36644106694c72eb46f305d46305" + integrity sha512-22Ba6/9u/7UHnnwWQBDEIy3GrKbacMHUfS1+0XO1sjiEwQFV+eoJnnwnNX5PVS3pEx0srIKhaCCs9RtUrsM8+w== + dependencies: + "@babel/core" "^7.15.5" + "@babel/plugin-transform-react-constant-elements" "^7.14.5" + "@babel/preset-env" "^7.15.6" + "@babel/preset-react" "^7.14.5" + "@babel/preset-typescript" "^7.15.0" + "@svgr/core" "^6.1.1" + "@svgr/plugin-jsx" "^6.1.0" + "@svgr/plugin-svgo" "^6.1.0" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@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/cssnano@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/cssnano/-/cssnano-4.0.1.tgz#67fa912753d80973a016e7684a47fedf338aacff" + integrity sha512-hGOroxRTBkYl5gSBRJOffhV4+io+Y2bFX1VP7LgKEVHJt/LPPJaWUIuDAz74Vlp7l7hCDZfaDi7iPxwNwuVA4Q== + dependencies: + postcss "5 - 7" + +"@types/eslint-scope@^3.7.0": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.2.1.tgz#13f3d69bac93c2ae008019c28783868d0a1d6605" + integrity sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/github-slugger@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/github-slugger/-/github-slugger-1.3.0.tgz#16ab393b30d8ae2a111ac748a015ac05a1fc5524" + integrity sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g== + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@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-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== + dependencies: + "@types/node" "*" + +"@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.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/katex@^0.11.0": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.11.1.tgz#34de04477dcf79e2ef6c8d23b41a3d81f9ebeaf5" + integrity sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/node@*": + version "16.11.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10" + integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw== + +"@types/node@^15.0.1": + version "15.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" + integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== + +"@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/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + +"@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/react@*": + version "17.0.37" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959" + integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/sax@^1.2.1": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.3.tgz#b630ac1403ebd7812e0bf9a10de9bf5077afb348" + integrity sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@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== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.0.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^6.1.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^8.0.4, acorn@^8.4.1: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== + +address@^1.0.1, address@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +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.0.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.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.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +algoliasearch-helper@^3.5.5: + version "3.6.2" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.6.2.tgz#45e19b12589cfa0c611b573287f65266ea2cc14a" + integrity sha512-Xx0NOA6k4ySn+R2l3UMSONAaMkyfmrZ3AP1geEMo32MxDJQJesZABZYsldO9fa6FKQxH91afhi4hO1G0Zc2opg== + dependencies: + events "^1.1.1" + +algoliasearch@^4.0.0, algoliasearch@^4.10.5: + version "4.11.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.11.0.tgz#234befb3ac355c094077f0edf3777240b1ee013c" + integrity sha512-IXRj8kAP2WrMmj+eoPqPc6P7Ncq1yZkFiyDrjTBObV1ADNL8Z/KdZ+dWC5MmYcBLAbcB/mMCpak5N/D1UIZvsA== + dependencies: + "@algolia/cache-browser-local-storage" "4.11.0" + "@algolia/cache-common" "4.11.0" + "@algolia/cache-in-memory" "4.11.0" + "@algolia/client-account" "4.11.0" + "@algolia/client-analytics" "4.11.0" + "@algolia/client-common" "4.11.0" + "@algolia/client-personalization" "4.11.0" + "@algolia/client-search" "4.11.0" + "@algolia/logger-common" "4.11.0" + "@algolia/logger-console" "4.11.0" + "@algolia/requester-browser-xhr" "4.11.0" + "@algolia/requester-common" "4.11.0" + "@algolia/requester-node-http" "4.11.0" + "@algolia/transporter" "4.11.0" + +alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +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" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + +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== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +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== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +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.3.5, autoprefixer@^10.3.7: + version "10.4.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8" + integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA== + dependencies: + browserslist "^4.17.5" + caniuse-lite "^1.0.30001272" + fraction.js "^4.1.1" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.1.0" + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +babel-loader@^8.2.2: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.0" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" + integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + core-js-compat "^3.18.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.0" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +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== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +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== + +bluebird@^3.7.1: + 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.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +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 sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^5.0.0, boxen@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +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" + +braces@^3.0.1, 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" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== + dependencies: + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +buble-jsx-only@^0.19.8: + version "0.19.8" + resolved "https://registry.yarnpkg.com/buble-jsx-only/-/buble-jsx-only-0.19.8.tgz#6e3524aa0f1c523de32496ac9aceb9cc2b493867" + integrity sha512-7AW19pf7PrKFnGTEDzs6u9+JZqQwM1VnLS19OlqYDhXomtFFknnoQJAPHeg84RMFWAvOhYrG7harizJNwUKJsA== + dependencies: + acorn "^6.1.1" + acorn-dynamic-import "^4.0.0" + acorn-jsx "^5.0.1" + chalk "^2.4.2" + magic-string "^0.25.3" + minimist "^1.2.0" + regexpu-core "^4.5.4" + +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== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +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@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" + integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== + +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.30001272, caniuse-lite@^1.0.30001280: + version "1.0.30001286" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6" + integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ== + +ccount@^1.0.0, ccount@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + 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@^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" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +cheerio-select@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" + integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== + dependencies: + css-select "^4.1.3" + css-what "^5.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + domutils "^2.7.0" + +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +cheerio@^1.0.0-rc.3: + version "1.0.0-rc.10" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" + integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== + dependencies: + cheerio-select "^1.5.0" + dom-serializer "^1.3.2" + domhandler "^4.2.0" + htmlparser2 "^6.1.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + tslib "^2.2.0" + +chokidar@^3.4.2, chokidar@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + 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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.1.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +clean-css@^5.1.5, clean-css@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.2.tgz#d3a7c6ee2511011e051719838bdcf8314dc4548d" + integrity sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clsx@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +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" + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +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 sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +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.1" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e" + integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw== + +colorette@^2.0.10: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +combine-promises@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" + integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.19.0, 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@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +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@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +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 sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-text-to-clipboard@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" + integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== + +copy-webpack-plugin@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz#2d2c460c4c4695ec0a58afb2801a1205256c4e6b" + integrity sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA== + dependencies: + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^11.0.3" + normalize-path "^3.0.0" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + +core-js-compat@^3.18.0, core-js-compat@^3.19.1: + version "3.19.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.3.tgz#de75e5821c5ce924a0a1e7b7d5c2cb973ff388aa" + integrity sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA== + dependencies: + browserslist "^4.18.1" + semver "7.0.0" + +core-js-pure@^3.19.0: + version "3.19.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.19.3.tgz#c69b2b36b58927317824994b532ec3f0f7e49607" + integrity sha512-N3JruInmCyt7EJj5mAq3csCgGYgiSqu7p7TQp2KOztr180/OAIxyIvL1FCjzgmQk/t3Yniua50Fsak7FShI9lA== + +core-js@^3.18.0: + version "3.19.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.3.tgz#6df8142a996337503019ff3235a7022d7cdf4559" + integrity sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g== + +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, cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + 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-fetch@^3.0.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + +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-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-declaration-sorter@^6.0.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2" + integrity sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA== + dependencies: + timsort "^0.3.0" + +css-loader@^5.1.1: + version "5.2.7" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== + dependencies: + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.2.0.tgz#f59c56ec11137b37f000081bd19b450095094ad2" + integrity sha512-5q4myvkmm29jRlI73Fl8Mc008i6o6hCEKnV6/fOrzRVDWD6EFGwDRX+SM2qCVeZ7XiztRDKHpTGDUeUMAOOagg== + dependencies: + "@types/cssnano" "^4.0.1" + 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-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.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +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-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +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@^5.0.0, css-what@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== + +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-advanced@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.1.8.tgz#48678297b93d4964cd437ed1fa28d7f11ebf353c" + integrity sha512-QUR5/s3ZKX4hdrefOdTMdyzZ5RbBIt+GxcDh7bmu2yG21PqszQBtA02QG9ilsI1E7OCjkM4KlzaGtQ75GdGa3g== + dependencies: + autoprefixer "^10.3.7" + cssnano-preset-default "^5.1.8" + postcss-discard-unused "^5.0.1" + postcss-merge-idents "^5.0.1" + postcss-reduce-idents "^5.0.1" + postcss-zindex "^5.0.1" + +cssnano-preset-default@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.8.tgz#7525feb1b72f7b06e57f55064cbdae341d79dea2" + integrity sha512-zWMlP0+AMPBVE852SqTrP0DnhTcTA2C1wAF92TKZ3Va+aUVqLIhkqKlnJIXXdqXD7RN+S1ujuWmNpvrJBiM/vg== + dependencies: + css-declaration-sorter "^6.0.3" + cssnano-utils "^2.0.1" + postcss-calc "^8.0.0" + postcss-colormin "^5.2.1" + postcss-convert-values "^5.0.2" + postcss-discard-comments "^5.0.1" + postcss-discard-duplicates "^5.0.1" + postcss-discard-empty "^5.0.1" + postcss-discard-overridden "^5.0.1" + postcss-merge-longhand "^5.0.4" + postcss-merge-rules "^5.0.3" + postcss-minify-font-values "^5.0.1" + postcss-minify-gradients "^5.0.3" + postcss-minify-params "^5.0.2" + postcss-minify-selectors "^5.1.0" + postcss-normalize-charset "^5.0.1" + postcss-normalize-display-values "^5.0.1" + postcss-normalize-positions "^5.0.1" + postcss-normalize-repeat-style "^5.0.1" + postcss-normalize-string "^5.0.1" + postcss-normalize-timing-functions "^5.0.1" + postcss-normalize-unicode "^5.0.1" + postcss-normalize-url "^5.0.3" + postcss-normalize-whitespace "^5.0.1" + postcss-ordered-values "^5.0.2" + postcss-reduce-initial "^5.0.2" + postcss-reduce-transforms "^5.0.1" + postcss-svgo "^5.0.3" + postcss-unique-selectors "^5.0.2" + +cssnano-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" + integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== + +cssnano@^5.0.6, cssnano@^5.0.8: + version "5.0.12" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.12.tgz#2c083a1c786fc9dc2d5522bd3c0e331b7cd302ab" + integrity sha512-U38V4x2iJ3ijPdeWqUrEr4eKBB5PbEKsNP5T8xcik2Au3LeMtiMHX0i2Hu9k51FcKofNZumbrcdC6+a521IUHg== + dependencies: + cssnano-preset-default "^5.1.8" + is-resolvable "^1.1.0" + 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" + +csstype@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + +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@^3.1.1: + 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@^4.1.0, debug@^4.1.1, debug@^4.2.0: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-equal@^1.0.1: + 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-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +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" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +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: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +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" + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +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" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +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-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, dom-serializer@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.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.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, 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.6.0, domutils@^2.7.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" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1, 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 sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.896: + version "1.4.16" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz#38ddecc616385e6f101359d1b978c802664157d2" + integrity sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA== + +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== + +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== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + +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" + +es-abstract@^1.17.2, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +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" + +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-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +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== + +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" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +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: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +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== + +eta@^1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.3.tgz#2982d08adfbef39f9fa50e2fbd42d7337e7338b1" + integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eval@^0.1.4: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.6.tgz#9620d7d8c85515e97e6b47c5814f46ae381cb3cc" + integrity sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ== + dependencies: + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +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" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +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-glob@^3.1.1, fast-glob@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + 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: + 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-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + 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" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.1.tgz#70a053d34a96c2b513b559eaea124daed49ace64" + integrity sha512-8+vkGyT4lNDRKHQNPp0yh/6E7FfkLg89XqQbOYnvntRh+8RiSD43yrh9E5ejp1muCizTL4nDVG+y8W4e+LROHg== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +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" + +filesize@^6.1.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" + integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== + +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.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +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-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" + +flux@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" + integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.14.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd" + integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A== + +fork-ts-checker-webpack-plugin@^6.0.5: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz#0282b335fa495a97e167f69018f566ea7d2a2b5e" + integrity sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw== + 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" + +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.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + 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.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +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== + +gensync@^1.0.0-beta.1, 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-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +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-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +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" + +github-slugger@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" + integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + +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.1: + 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.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + 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" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.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== + +globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, 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: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +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== + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +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-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +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-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +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" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz#3089dc0ee2ccf6ec8bc416919b51a54a589e097c" + integrity sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA== + dependencies: + ccount "^1.0.3" + hastscript "^5.0.0" + property-information "^5.0.0" + web-namespaces "^1.1.2" + xtend "^4.0.1" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-is-element@1.1.0, hast-util-is-element@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" + integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-text@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-2.0.1.tgz#04f2e065642a0edb08341976084aa217624a0f8b" + integrity sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ== + dependencies: + hast-util-is-element "^1.0.0" + repeat-string "^1.0.0" + unist-util-find-after "^3.0.0" + +hastscript@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" + integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +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.1.0: + 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" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + +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-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + 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@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +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-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== + +http-proxy-middleware@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" + integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== + dependencies: + "@types/http-proxy" "^1.17.5" + 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" + +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== + +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" + +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== + +ignore@^5.1.4: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immer@^9.0.6: + version "9.0.7" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.7.tgz#b6156bd7db55db7abc73fd2fdadf4e579a701075" + integrity sha512-KGllzpbamZDvOIxnmJ0jI840g7Oikx58lBPWV0hUh7dtAyZpFqqrBZdKka5GlTwMTZ1Tjc/bKKW4VSFAt6BqMA== + +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.2.2, import-fresh@^3.3.0: + 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-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +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== + +infima@0.2.0-alpha.34: + version "0.2.0-alpha.34" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.34.tgz#14a900d79a4de2013e025ac95749a4592f16ef6e" + integrity sha512-Na6A2Tl56i1p9dzu7VOAT1Kmu3f5buz63Wvd+D9ZZWL6siQ47L7wkEZUICVKFgc5gERFZVZ/PoPB57Kl++h37Q== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, 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 sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +ip@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +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.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + 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-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +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-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + 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-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +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-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +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-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-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + 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 sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + 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@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +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-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +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 sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +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-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +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-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-weakref@^1.0.1: + 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-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^2.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" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^27.0.2, jest-worker@^27.0.6: + version "27.4.4" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.4.tgz#9390a97c013a54d07f5c2ad2b5f6109f30c4966d" + integrity sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +joi@^17.4.0, joi@^17.4.2: + version "17.5.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.5.0.tgz#7e66d0004b5045d971cf416a55fb61d33ac6e011" + integrity sha512-R7hR50COp7StzLnDi4ywOXHrBrgNXuUUfJWIR5lPY5Bm/pOD3jZaTwpluUXVLRWcoWZxkrHBBJ5hLxgnlehbdw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +"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.0.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" + +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 sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + 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== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +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" + +katex@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" + integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== + dependencies: + commander "^2.19.0" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^6.0.0, 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== + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +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.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +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== + +lilconfig@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== + +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.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +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.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.4.0: + 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.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, 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" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +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" + +lunr-languages@^1.4.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/lunr-languages/-/lunr-languages-1.9.0.tgz#7105230807788a112a69910561b7bbd055a0e588" + integrity sha512-Be5vFuc8NAheOIjviCRms3ZqFFBlzns3u9DXpPSZvALetgnydAN0poV71pVLFn0keYy/s4VblMMkqewTLe+KPg== + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +magic-string@^0.25.3: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +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" + +mark.js@^8.11.1: + version "8.11.1" + resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + integrity sha1-GA8fnr74sOY45BZq1S24eb6y/8U= + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +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== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.1.2, memfs@^3.2.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.0.tgz#8bc12062b973be6b295d4340595736a656f0a257" + integrity sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA== + dependencies: + fs-monkey "1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +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: + 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 sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.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== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz#83172b4fd812f8fc4a09d6f6d16f924f53990ca8" + integrity sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + webpack-sources "^1.1.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.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mrmime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +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.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-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +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== + +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-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +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 sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +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" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= + +nth-check@^1.0.2, nth-check@~1.0.1: + 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.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b" + integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== + +object-is@^1.0.1: + 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.0.12, 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.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.values@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +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.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + 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, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + 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@^7.0.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +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-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + 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== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +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-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.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" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.0, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +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 sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +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 sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +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.6: + 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 sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +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== + +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.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^4.1.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" + +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== + dependencies: + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.1.tgz#6e444a806fd3c578827dbad022762df19334414d" + integrity sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.1.0" + +postcss-convert-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz#879b849dc3677c7d6bc94b6a2c1a3f0808798059" + integrity sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-discard-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" + integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== + +postcss-discard-duplicates@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" + integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== + +postcss-discard-empty@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" + integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== + +postcss-discard-overridden@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" + integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== + +postcss-discard-unused@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.0.1.tgz#63e35a74a154912f93d4e75a1e6ff3cc146f934b" + integrity sha512-tD6xR/xyZTwfhKYRw0ylfCY8wbfhrjpKAMnDKRTLMy2fNW5hl0hoV6ap5vo2JdCkuHkP3CHw72beO4Y8pzFdww== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^6.1.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-merge-idents@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.0.1.tgz#6b5856fc28f2571f28ecce49effb9b0e64be9437" + integrity sha512-xu8ueVU0RszbI2gKkxR6mluupsOSSLvt8q4gA2fcKFkA+x6SlH3cb4cFHpDvcRCNFbUmCR/VUub+Y6zPOjPx+Q== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-merge-longhand@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz#41f4f3270282ea1a145ece078b7679f0cef21c32" + integrity sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw== + dependencies: + postcss-value-parser "^4.1.0" + stylehacks "^5.0.1" + +postcss-merge-rules@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.3.tgz#b5cae31f53129812a77e3eb1eeee448f8cf1a1db" + integrity sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^2.0.1" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" + integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-minify-gradients@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz#f970a11cc71e08e9095e78ec3a6b34b91c19550e" + integrity sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q== + dependencies: + colord "^2.9.1" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-minify-params@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.2.tgz#1b644da903473fbbb18fbe07b8e239883684b85c" + integrity sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg== + dependencies: + alphanum-sort "^1.0.2" + browserslist "^4.16.6" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-minify-selectors@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" + integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== + dependencies: + alphanum-sort "^1.0.2" + 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.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + 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-normalize-charset@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" + integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== + +postcss-normalize-display-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" + integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-positions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" + integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-repeat-style@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" + integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-string@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" + integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-timing-functions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" + integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-unicode@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" + integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== + dependencies: + browserslist "^4.16.0" + postcss-value-parser "^4.1.0" + +postcss-normalize-url@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.3.tgz#42eca6ede57fe69075fab0f88ac8e48916ef931c" + integrity sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg== + dependencies: + is-absolute-url "^3.0.3" + normalize-url "^6.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-whitespace@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" + integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-ordered-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" + integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-reduce-idents@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.0.1.tgz#99b49ce8ee6f9c179447671cc9693e198e877bb7" + integrity sha512-6Rw8iIVFbqtaZExgWK1rpVgP7DPFRPh0DDFZxJ/ADNqPiH10sPCoq5tgo6kLiTyfh9sxjKYjXdc8udLEcPOezg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-reduce-initial@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz#fa424ce8aa88a89bc0b6d0f94871b24abe94c048" + integrity sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" + integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: + version "6.0.7" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz#48404830a635113a71fd79397de8209ed05a66fc" + integrity sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz#a99bae69ef1098ee3b64a5fa94d258ec240d0355" + integrity sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ== + dependencies: + sort-css-media-queries "2.0.4" + +postcss-svgo@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.3.tgz#d945185756e5dfaae07f9edb0d3cae7ff79f9b30" + integrity sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA== + dependencies: + postcss-value-parser "^4.1.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz#5d6893daf534ae52626708e0d62250890108c0c1" + integrity sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.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-zindex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.0.1.tgz#c585724beb69d356af8c7e68847b28d6298ece03" + integrity sha512-nwgtJJys+XmmSGoYCcgkf/VczP8Mp/0OfSv3v0+fw0uABY4yxw+eFs0Xp9nAZHIKnS5j+e9ywQ+RD+ONyvl5pA== + +"postcss@5 - 7": + 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.2.15, postcss@^8.3.11, postcss@^8.3.5, postcss@^8.3.7: + version "8.4.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" + integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +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-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz#392460acf63540960e5e3caa699d851264e99b89" + integrity sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg== + +prismjs@^1.23.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" + integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg== + +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@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.4.0, prompts@^2.4.1: + 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.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.5: + 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" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +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== + +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.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +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.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@12.0.0-next.47: + version "12.0.0-next.47" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.0-next.47.tgz#e55c31a05eb30cfd69ca516e8b87d61724e880fb" + integrity sha512-PsE71vP15TZMmp/RZKOJC4fYD5Pvt0+wCoyG3QHclto0d4FyIJI78xGRICOOThZFROqgXYlZP6ddmeybm+jO4w== + dependencies: + "@babel/code-frame" "^7.10.4" + address "^1.1.2" + browserslist "^4.16.5" + chalk "^2.4.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^2.0.0" + filesize "^6.1.0" + find-up "^4.1.0" + fork-ts-checker-webpack-plugin "^6.0.5" + global-modules "^2.0.0" + globby "^11.0.1" + gzip-size "^5.1.1" + immer "^9.0.6" + is-root "^2.1.0" + loader-utils "^2.0.0" + open "^7.0.2" + pkg-up "^3.1.0" + prompts "^2.4.0" + react-error-overlay "7.0.0-next.54+1465357b" + recursive-readdir "^2.2.2" + shell-quote "^1.7.2" + strip-ansi "^6.0.0" + text-table "^0.2.0" + +react-dom@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-error-overlay@7.0.0-next.54+1465357b: + version "7.0.0-next.54" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-7.0.0-next.54.tgz#c1eb5ab86aee15e9552e6d97897b08f2bd06d140" + integrity sha512-b96CiTnZahXPDNH9MKplvt5+jD+BkxDw7q5R3jnkUXze/ux1pLv32BBZmlj0OfCUeMqyz4sAmF+0ccJGVMlpXw== + +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + +react-fast-compare@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-helmet@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== + dependencies: + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" + +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: + 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-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +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-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" + integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.1" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.1, react-router@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" + integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-side-effect@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" + integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== + +react-textarea-autosize@^8.3.2: + version "8.3.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" + integrity sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ== + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.0.0" + use-latest "^1.0.0" + +react@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +readable-stream@^2.0.1: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + 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, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + 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" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + 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.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.5.4, regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + +rehype-katex@4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-4.0.0.tgz#ce11a5db0bff014350e7a9cfd30147d314b14330" + integrity sha512-0mgBqYugQyIW0eUl6RDOZ28Cat2YzrnWGaYgKCMQnJw6ClmKgLqXBnkDAPGh2mwxvkkKwQOUMUpSLpA5rt7rzA== + dependencies: + "@types/katex" "^0.11.0" + hast-util-to-text "^2.0.0" + katex "^0.12.0" + rehype-parse "^7.0.0" + unified "^9.0.0" + unist-util-visit "^2.0.0" + +rehype-parse@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz#aeb3fdd68085f9f796f1d3137ae2b85a98406964" + integrity sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug== + dependencies: + hast-util-from-parse5 "^5.0.0" + parse5 "^5.0.0" + xtend "^4.0.0" + +rehype-parse@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-7.0.1.tgz#58900f6702b56767814afc2a9efa2d42b1c90c57" + integrity sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw== + dependencies: + hast-util-from-parse5 "^6.0.0" + parse5 "^6.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-admonitions@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.2.1.tgz#87caa1a442aa7b4c0cafa04798ed58a342307870" + integrity sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow== + dependencies: + rehype-parse "^6.0.2" + unified "^8.4.2" + unist-util-visit "^2.0.1" + +remark-emoji@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.3" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-math@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-3.0.1.tgz#85a02a15b15cad34b89a27244d4887b3a95185bb" + integrity sha512-epT77R/HK0x7NqrWHdSV75uNLwn8g9qTyMqCRCDujL0vj/6T6+yhdrR7mjELWtkse+Fw02kijAaBuVcHBor1+Q== + +remark-mdx-remove-exports@^1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx-remove-exports/-/remark-mdx-remove-exports-1.6.22.tgz#9e34f3d02c9c54b02ca0a1fde946449338d06ecb" + integrity sha512-7g2uiTmTGfz5QyVb+toeX25frbk1Y6yd03RXGPtqx0+DVh86Gb7MkNYbk7H2X27zdZ3CQv1W/JqlFO0Oo8IxVA== + dependencies: + unist-util-remove "2.0.0" + +remark-mdx-remove-imports@^1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx-remove-imports/-/remark-mdx-remove-imports-1.6.22.tgz#79f711c95359cff437a120d1fbdc1326ec455826" + integrity sha512-lmjAXD8Ltw0TsvBzb45S+Dxx7LTJAtDaMneMAv8LAUIPEyYoKkmGbmVsiF0/pY6mhM1Q16swCmu1TN+ie/vn/A== + dependencies: + unist-util-remove "2.0.0" + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +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" + +repeat-string@^1.0.0, repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +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== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +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-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@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^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== + +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" + +rtl-detect@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" + integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== + +rtlcss@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" + +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" + +rxjs@^7.1.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" + integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== + dependencies: + tslib "~2.1.0" + +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.1.0, safe-buffer@^5.0.1, 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== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +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== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +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.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.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 sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.11: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.4.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, 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.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.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 sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + 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.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +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.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +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.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +shelljs@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +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.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.0.0.tgz#022bef4df8cba42e38e1fe77039f234cab0372b6" + integrity sha512-Ud0jrRQO2k7fEtPAM+cQkBKoMvxQyPKNXKDLn8tRVHxRCsdDQ2JZvw+aZ5IRYYQVAV9iGxEar6boTwZzev+x3g== + dependencies: + "@types/node" "^15.0.1" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +sockjs@^0.3.21: + 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" + +sort-css-media-queries@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz#b2badfa519cb4a938acbc6d3aaa913d4949dc908" + integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== + +source-list-map@^2.0.0: + 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@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + +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.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +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.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +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 sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +std-env@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.3.1.tgz#d42271908819c243f8defc77a140fc1fcee336a1" + integrity sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g== + dependencies: + ci-info "^3.1.1" + +std-env@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.0.1.tgz#bc4cbc0e438610197e34c2d79c3df30b491f5182" + integrity sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: + 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.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +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.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + +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-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== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" + integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== + dependencies: + browserslist "^4.16.0" + postcss-selector-parser "^6.0.4" + +supports-color@^5.3.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.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" + +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.5.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" + +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== + +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.4: + version "5.2.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9" + integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g== + dependencies: + jest-worker "^27.0.6" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.10.0, terser@^5.7.2: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +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== + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-invariant@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +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 sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +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.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trim@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.3.tgz#05243a47a3a4113e6b49367880a9cca59697a20b" + integrity sha512-h82ywcYhHK7veeelXrCScdH7HkWfbIT1D/CgYO+nmDarz3SGNssVBMws6jU16Ga60AJCRAvPV6w6RLuNerQqjg== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +ts-essentials@^2.0.3: + version "2.0.12" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" + integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== + +tslib@^2.0.3, tslib@^2.2.0, tslib@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +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-is@~1.6.17, 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" + +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" + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +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.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz#13ad58b4a437faa2751a4a4c6a16f680c500fff1" + integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.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" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-find-after@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-3.0.0.tgz#5c65fcebf64d4f8f496db46fa8fd0fbf354b43e6" + integrity sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ== + dependencies: + unist-util-is "^4.0.0" + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.0.0.tgz#32c2ad5578802f2ca62ab808173d505b2c898488" + integrity sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g== + dependencies: + unist-util-is "^4.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.2, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +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 sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.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-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use-composed-ref@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.1.0.tgz#9220e4e94a97b7b02d7d27eaeab0b37034438bbc" + integrity sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg== + dependencies: + ts-essentials "^2.0.3" + +use-isomorphic-layout-effect@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" + integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ== + +use-latest@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" + integrity sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw== + dependencies: + use-isomorphic-layout-effect "^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 sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +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 sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +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== + +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 sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +wait-on@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.0.tgz#7e9bf8e3d7fe2daecbb7a570ac8ca41e9311c7e7" + integrity sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw== + dependencies: + axios "^0.21.1" + joi "^17.4.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.1.0" + +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + 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-namespaces@^1.0.0, web-namespaces@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webpack-bundle-analyzer@^4.4.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-dev-middleware@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz#eb5193faa5479ca1086b9f7bed68b89c731bff62" + integrity sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w== + dependencies: + colorette "^2.0.10" + memfs "^3.2.2" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz#e8648601c440172d9b6f248d28db98bed335315a" + integrity sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg== + dependencies: + ansi-html-community "^0.0.8" + bonjour "^3.5.0" + chokidar "^3.5.2" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + del "^6.0.0" + express "^4.17.1" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^4.0.0" + selfsigned "^1.10.11" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + strip-ansi "^7.0.0" + url "^0.11.0" + webpack-dev-middleware "^5.2.1" + ws "^8.1.0" + +webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.1.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@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260" + integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== + +webpack@^5.61.0: + version "5.65.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.65.0.tgz#ed2891d9145ba1f0d318e4ea4f89c3fa18e6f9be" + integrity sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.2" + +webpackbar@^5.0.0-3: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +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== + +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@^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" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +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 sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +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.3.1: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + +ws@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" + integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0, 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== + +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== + +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== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==