diff --git a/.travis.yml b/.travis.yml index d576bb7e..6922d5a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,43 +1,61 @@ dist: trusty branches: - only: - - master + only: + - master jobs: - include: - - language: java - jdk: oraclejdk11 - services: - - docker - before_script: - - cd ./vscode4teaching-server/ - - chmod +x mvnw - script: - - "./mvnw clean package -B -q" - after_script: - - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - - docker build -t vscode4teaching/vscode4teaching:2.0.2 . - - docker build -t vscode4teaching/vscode4teaching:latest . - - docker push vscode4teaching/vscode4teaching:2.0.2 - - docker push vscode4teaching/vscode4teaching:latest - - language: node_js - os: - - linux - - osx - node_js: 10.15.3 - install: - - | - if [ $TRAVIS_OS_NAME == "linux" ]; then - export DISPLAY=':99.0' - /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & - fi - before_script: - - cd ./vscode4teaching-extension - - npm install --save-dev - script: - - npm test - cache: - npm: false + include: + - name: V4T Server (Spring Boot) + language: java + jdk: oraclejdk11 + services: + - docker + before_script: + - cd ./vscode4teaching-server/ + - chmod +x mvnw + script: + - "./mvnw clean package -B -q" + after_script: + - cd .. + - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + - docker build -t vscode4teaching/vscode4teaching:2.1.1-beta . + # Beta version: latest won't be changed until 2.1.X is finally released + # - docker build -t vscode4teaching/vscode4teaching:latest . + - docker push vscode4teaching/vscode4teaching:2.1.1-beta + # - docker push vscode4teaching/vscode4teaching:latest + - name: V4T Extension (Node.js) + language: node_js + os: + - linux + - osx + node_js: 10.15.3 + install: + - | + if [ $TRAVIS_OS_NAME == "linux" ]; then + export DISPLAY=':99.0' + /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + fi + before_script: + - cd ./vscode4teaching-extension + - npm install --save-dev + script: + - npm test + cache: + npm: false + # WebApp testing temporarily disabled (not ready yet) + #- name: V4T WebApp (Angular) + # language: node_js + # os: + # - linux + # - osx + # node_js: 16.13.2 + # before_script: + # - cd ./vscode4teaching-webapp + # - npm install --save-dev + # script: + # - npm test + # cache: + # npm: false env: - global: - - secure: Xubi//N9TBKtampk7kO3V0rvuhbCIzVJ7ad2oJIoZGVUyCgmt9KdK46jfG2eSUYuvOMKg1xrXia0R0YC+VveoJPiRgCxqNIfqhb605XaY0SLRXAh2cThABs6q3IwFzoFVIG/8/xhZpqSngbystQxm8EflGhYdZYukijqtEEx78VrtuWaPRBcxGBFt8GaaLyzWvy8eY6Fzw4KZntZPHaalLt0t5k+Qt+Dt2AJuUb3YV1IaWyMQIeF0dKM2XLMpUISeRBVzPrqSmRxpbMyR+8iktPY2KYJFmeH1MD8H1imG/OVkHxSRiXsPXkZ8ueqXSzZ1R9cNIR6ZLKRIyo2sMvxRz5Kzr2fhcEtxCtyRW0sXFV4EG7lsUewn9E9MJ7e5OtnwZOKkcIvStydrwd3t9TH+pUdptgVGA+EdL/T4mcIjPkzYWPoUoLn1MYR3YYUezvqsJXrgl4HqQJSSLgaCEso/q/s5+IH+1y4xFYpLNo05+OhMWz0vNCBbPT02VC+6YTQwHAOcGNjOHDwgkwkg1KC46ZMkbdfm4bhNL1oWfAPynuHjNAfinzxc0kE/FataPXVEt7XX+dA3YdQL+KffqKdRLQqDgsQ1ZNvE+oZwJT1NMfIhlsreboBl1C9diQrxfLwaHBZjUXuNpbI6FK8W8iyQvBNfPWvcdKdMmrNdQV7268= - - secure: nWKjhXkCD7qAjXAO//DYZXAcC5dDVtX+EgxQOAyCoyTfw0hdtxIHbn2iylpPlkd9iLObEkK1R30TWXsteZMHyBHJEgJM+YueuVqTUXKgS+EK6F0PebvgjyhZzfIZrTWOmhieHC/cXmDLeJbVkO+9++5KYGj0nYxkURqVXrguYlU7g+InbE8/raYjWsmpUVjhaEd245fyT2jmwSiaxiu8tWa9KuawsQeS/CVSNYAZaXfpLUk2ZOqOOxtR1TWfAv+4C84i6u+KhUS9FI6Li5MBMIZkU+npyx9gWw2EzmQf2ciqPYIGyRUe50tx5HLufZZ31RYae0jowuy7UpOQckNOG+hUxdzMCGX1pwh2mgKEKFL1XC8AsFo+rIt9eJhRaJN+hAQ8VtAhc8VzrdQhSn1CPgrT3ePO3wjyjo49MZjOrWd9q6r1DSXYQcOURFa2iUp+v5z4RFbAAyW/eAaEXlUr62ACQrQqZ5gGqchRYm2W2a5T+gua7ToyXO4yNzCt27hUv6c4kgtS7ATm1PKvD0/oDA6k6Roix4BJER38ONdp6sj8fmuEUfvTnS5QmVh8Zg4rf4htBGPriE/UFF2SSvj4kYj5ZKVFYeP4wGMhiGjADSp81LVdrSnGe7P7HoYEX3CGnukabV9+3b3eOXr+iy4e0UxZLsTp8Gs8T85Qqc6Kpc0= + global: + - secure: Xubi//N9TBKtampk7kO3V0rvuhbCIzVJ7ad2oJIoZGVUyCgmt9KdK46jfG2eSUYuvOMKg1xrXia0R0YC+VveoJPiRgCxqNIfqhb605XaY0SLRXAh2cThABs6q3IwFzoFVIG/8/xhZpqSngbystQxm8EflGhYdZYukijqtEEx78VrtuWaPRBcxGBFt8GaaLyzWvy8eY6Fzw4KZntZPHaalLt0t5k+Qt+Dt2AJuUb3YV1IaWyMQIeF0dKM2XLMpUISeRBVzPrqSmRxpbMyR+8iktPY2KYJFmeH1MD8H1imG/OVkHxSRiXsPXkZ8ueqXSzZ1R9cNIR6ZLKRIyo2sMvxRz5Kzr2fhcEtxCtyRW0sXFV4EG7lsUewn9E9MJ7e5OtnwZOKkcIvStydrwd3t9TH+pUdptgVGA+EdL/T4mcIjPkzYWPoUoLn1MYR3YYUezvqsJXrgl4HqQJSSLgaCEso/q/s5+IH+1y4xFYpLNo05+OhMWz0vNCBbPT02VC+6YTQwHAOcGNjOHDwgkwkg1KC46ZMkbdfm4bhNL1oWfAPynuHjNAfinzxc0kE/FataPXVEt7XX+dA3YdQL+KffqKdRLQqDgsQ1ZNvE+oZwJT1NMfIhlsreboBl1C9diQrxfLwaHBZjUXuNpbI6FK8W8iyQvBNfPWvcdKdMmrNdQV7268= + - secure: nWKjhXkCD7qAjXAO//DYZXAcC5dDVtX+EgxQOAyCoyTfw0hdtxIHbn2iylpPlkd9iLObEkK1R30TWXsteZMHyBHJEgJM+YueuVqTUXKgS+EK6F0PebvgjyhZzfIZrTWOmhieHC/cXmDLeJbVkO+9++5KYGj0nYxkURqVXrguYlU7g+InbE8/raYjWsmpUVjhaEd245fyT2jmwSiaxiu8tWa9KuawsQeS/CVSNYAZaXfpLUk2ZOqOOxtR1TWfAv+4C84i6u+KhUS9FI6Li5MBMIZkU+npyx9gWw2EzmQf2ciqPYIGyRUe50tx5HLufZZ31RYae0jowuy7UpOQckNOG+hUxdzMCGX1pwh2mgKEKFL1XC8AsFo+rIt9eJhRaJN+hAQ8VtAhc8VzrdQhSn1CPgrT3ePO3wjyjo49MZjOrWd9q6r1DSXYQcOURFa2iUp+v5z4RFbAAyW/eAaEXlUr62ACQrQqZ5gGqchRYm2W2a5T+gua7ToyXO4yNzCt27hUv6c4kgtS7ATm1PKvD0/oDA6k6Roix4BJER38ONdp6sj8fmuEUfvTnS5QmVh8Zg4rf4htBGPriE/UFF2SSvj4kYj5ZKVFYeP4wGMhiGjADSp81LVdrSnGe7P7HoYEX3CGnukabV9+3b3eOXr+iy4e0UxZLsTp8Gs8T85Qqc6Kpc0= diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..175a4831 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# Step 1: Compilation of Angular frontend +# It will be embedded as a static resource into Spring Boot backend +FROM node:16.13.2 AS angular +COPY vscode4teaching-webapp /usr/src/app +WORKDIR /usr/src/app +RUN ["npm", "install"] +RUN ["npm", "run", "build"] + +# Step 2: Compilation of Maven project (generation of JAR) +FROM maven:3.8.4-jdk-11 AS builder +COPY vscode4teaching-server /data +COPY --from=angular /usr/src/app/dist /data/src/main/resources/static +WORKDIR /data +RUN ["mvn", "clean", "package"] + +# Step 3: Generation of Docker image using the JAR previously built +FROM adoptopenjdk/openjdk11:latest +RUN apt-get update && apt-get install -y netcat && rm -rf /var/lib/apt/lists/* +COPY --from=builder /data/target/vscode4teaching-server-*.jar ./app/vscode4teaching-server-*.jar +COPY vscode4teaching-server/docker/waitDB.sh ./app/waitDB.sh +EXPOSE 8080 +RUN ["chmod", "+x", "./app/waitDB.sh"] +CMD ["./app/waitDB.sh"] diff --git a/README.md b/README.md index 8fc41e43..9004298a 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,9 @@ [![Build Status](https://api.travis-ci.com/codeurjc-students/2019-VSCode4Teaching.svg?branch=master)](https://app.travis-ci.com/github/codeurjc-students/2019-VSCode4Teaching) [![Extension version](https://vsmarketplacebadge.apphb.com/version-short/VSCode4Teaching.vscode4teaching.svg)](https://marketplace.visualstudio.com/items?itemName=VSCode4Teaching.vscode4teaching) -[![Extension installs](https://vsmarketplacebadge.apphb.com/installs/VSCode4Teaching.vscode4teaching.svg)](https://marketplace.visualstudio.com/items?itemName=VSCode4Teaching.vscode4teaching) -VSCode extension for teaching. -Bring the programming exercises of a course directly to the student’s editor, so that the teacher of that course can check the progress of the students and help them. -Visit this [Medium blog](https://medium.com/@ivchicano) for updates on the development of this project. +[![Extension installs](https://vsmarketplacebadge.apphb.com/installs/VSCode4Teaching.vscode4teaching.svg)](https://marketplace.visualstudio.com/items?itemName=VSCode4Teaching.vscode4teaching) + +VSCode4Teaching is a [Visual Studio Code](https://code.visualstudio.com) extension that brings the programming exercises of a course directly to the student’s editor, so that the teacher of that course can check the progress of the students and help them. It was created and expanded by Iván Chicano Capelo (whose blog can be read clicking [here](https://medium.com/@ivchicano)) and Álvaro Justo Rivas Alcobendas. Currently, this project is being developed by Diego Guerrero Carrasco. All the information about the progress of this stage of the project can be read in [this blog](https://medium.com/@diego-guerrero). ## Table of Contents diff --git a/vscode4teaching-extension/package-lock.json b/vscode4teaching-extension/package-lock.json index c6bfc324..13b67b20 100644 --- a/vscode4teaching-extension/package-lock.json +++ b/vscode4teaching-extension/package-lock.json @@ -1,15 +1,15 @@ { "name": "vscode4teaching", - "version": "2.0.2", + "version": "2.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode4teaching", - "version": "2.0.2", + "version": "2.1.1", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "axios": "^0.21.1", + "axios": "^0.26.0", "form-data": "^3.0.0", "ignore": "^5.1.6", "jszip": "^3.4.0", @@ -40,7 +40,7 @@ "ts-jest": "^26.0.0", "ts-node": "^8.10.1", "tslint": "^5.20.1", - "typescript": "^3.9.3", + "typescript": "^3.9.10", "vscode-test": "^1.3.0" }, "engines": { @@ -2446,9 +2446,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.177", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz", - "integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==", + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", "dev": true }, "node_modules/@types/lodash.escaperegexp": { @@ -2601,15 +2601,19 @@ } }, "node_modules/ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-escapes": { @@ -2792,11 +2796,11 @@ "dev": true }, "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", + "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", "dependencies": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.8" } }, "node_modules/babel-jest": { @@ -4218,9 +4222,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "funding": [ { "type": "individual", @@ -9616,6 +9620,15 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -9958,9 +9971,9 @@ "dev": true }, "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "node_modules/to-fast-properties": { @@ -10157,6 +10170,15 @@ "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" } }, + "node_modules/tslint/node_modules/diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tslint/node_modules/mkdirp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", @@ -10170,6 +10192,12 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/tslint/node_modules/mkdirp/node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, "node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", @@ -10243,9 +10271,9 @@ } }, "node_modules/typescript": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", - "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12777,9 +12805,9 @@ } }, "@types/lodash": { - "version": "4.14.177", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz", - "integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==", + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", "dev": true }, "@types/lodash.escaperegexp": { @@ -12916,9 +12944,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -13062,11 +13090,11 @@ "dev": true }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz", + "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.8" } }, "babel-jest": { @@ -14240,9 +14268,9 @@ } }, "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "for-in": { "version": "1.0.2", @@ -18505,6 +18533,14 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "source-map-url": { @@ -18777,9 +18813,9 @@ "dev": true }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { @@ -18927,6 +18963,12 @@ "tsutils": "^2.29.0" }, "dependencies": { + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + }, "mkdirp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", @@ -18934,6 +18976,14 @@ "dev": true, "requires": { "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } } } } @@ -18993,9 +19043,9 @@ } }, "typescript": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", - "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true }, "unicode-canonical-property-names-ecmascript": { diff --git a/vscode4teaching-extension/package.json b/vscode4teaching-extension/package.json index 958da80a..fa9c237d 100644 --- a/vscode4teaching-extension/package.json +++ b/vscode4teaching-extension/package.json @@ -1,10 +1,19 @@ { "name": "vscode4teaching", "publisher": "VSCode4Teaching", - "author": { - "name": "Iván Chicano Capelo", - "email": "ivchicano@gmail.com" - }, + "contributors": [ + { + "name": "Iván Chicano Capelo", + "email": "ivchicano@gmail.com" + }, + { + "name": "Álvaro Justo Rivas Alcobendas" + }, + { + "name": "Diego Guerrero Carrasco", + "email": "d.guerrero.2018@alumnos.urjc.es" + } + ], "repository": { "type": "git", "url": "https://github.com/codeurjc-students/2019-VSCode4Teaching.git", @@ -12,7 +21,7 @@ }, "displayName": "VS Code 4 Teaching", "description": "Bring the programming exercises directly to the student’s editor.", - "version": "2.0.2", + "version": "2.1.1", "engines": { "vscode": "^1.61.0" }, @@ -100,6 +109,14 @@ "dark": "resources/dark/add.png" } }, + { + "command": "vscode4teaching.addmultipleexercises", + "title": "Add Multiple Exercises", + "icon": { + "light": "resources/light/add_multiple.png", + "dark": "resources/dark/add_multiple.png" + } + }, { "command": "vscode4teaching.editexercise", "title": "Edit Exercise", @@ -200,30 +217,35 @@ "group": "inline@2" }, { - "command": "vscode4teaching.editcourse", + "command": "vscode4teaching.addmultipleexercises", "when": "view == vscode4teachingview && viewItem == courseteacher", "group": "inline@3" }, { - "command": "vscode4teaching.deletecourse", + "command": "vscode4teaching.editcourse", "when": "view == vscode4teachingview && viewItem == courseteacher", "group": "inline@4" }, { - "command": "vscode4teaching.adduserstocourse", + "command": "vscode4teaching.deletecourse", "when": "view == vscode4teachingview && viewItem == courseteacher", "group": "inline@5" }, { - "command": "vscode4teaching.removeusersfromcourse", + "command": "vscode4teaching.adduserstocourse", "when": "view == vscode4teachingview && viewItem == courseteacher", "group": "inline@6" }, { - "command": "vscode4teaching.share", + "command": "vscode4teaching.removeusersfromcourse", "when": "view == vscode4teachingview && viewItem == courseteacher", "group": "inline@7" }, + { + "command": "vscode4teaching.share", + "when": "view == vscode4teachingview && viewItem == courseteacher", + "group": "inline@8" + }, { "command": "vscode4teaching.editexercise", "when": "view == vscode4teachingview && viewItem == exerciseteacher", @@ -325,11 +347,11 @@ "ts-jest": "^26.0.0", "ts-node": "^8.10.1", "tslint": "^5.20.1", - "typescript": "^3.9.3", + "typescript": "^3.9.10", "vscode-test": "^1.3.0" }, "dependencies": { - "axios": "^0.21.1", + "axios": "^0.26.0", "form-data": "^3.0.0", "ignore": "^5.1.6", "jszip": "^3.4.0", diff --git a/vscode4teaching-extension/resources/dark/add_multiple.png b/vscode4teaching-extension/resources/dark/add_multiple.png new file mode 100644 index 00000000..bdeec011 Binary files /dev/null and b/vscode4teaching-extension/resources/dark/add_multiple.png differ diff --git a/vscode4teaching-extension/resources/dashboard/dashboard.css b/vscode4teaching-extension/resources/dashboard/dashboard.css index 0b2ecfae..ccd40be8 100644 --- a/vscode4teaching-extension/resources/dashboard/dashboard.css +++ b/vscode4teaching-extension/resources/dashboard/dashboard.css @@ -3,12 +3,16 @@ table { width: 100%; } -body.vscode-light td, body.vscode-light th, body.vscode-dark td, body.vscode-dark th { +body.vscode-light td, +body.vscode-light th, +body.vscode-dark td, +body.vscode-dark th { border: 1px solid; text-align: center; } -body.vscode-high-contrast td, th { +body.vscode-high-contrast td, +th { border: 1px solid; text-align: center; } @@ -23,13 +27,13 @@ body.vscode-high-contrast td, th { .onprogress-cell { background-color: rgba(76, 149, 218, 0.644); - ; } button { background-color: var(--vscode-button-background); color: var(--vscode-button-foreground); border: none; + margin: 0.25rem; } button:hover { @@ -51,9 +55,71 @@ option:hover { } .reload-options { - border: 1px solid; - padding: 2px; + border-top: 1px solid; + border-bottom: 1px solid; + border-color: var(--vscode-button-background); + padding: 5px; margin-top: 2px; + margin-bottom: 10px; + display: flex; + justify-content: flex-end; +} + +.option { + display: flex; + align-items: center; + flex-direction: column; +} + +.switch { + position: relative; + display: inline-block; + width: 30px; + height: 17px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + outline: none; + background-color: #ccc; + transition: 0.25s; + border-radius: 17px; +} + +.slider:before { + position: absolute; + content: ""; + height: 13px; + width: 13px; + left: 2px; + bottom: 2px; + background-color: white; + -webkit-transition: 0.25s; + transition: 0.25s; + border-radius: 50%; +} + +input:checked + .slider { + background-color: var(--vscode-button-background); +} + +input:focus + .slider { + box-shadow: 0 0 1px var(--vscode-button-background); +} + +input:checked + .slider:before { + transform: translateX(13px); } table th { @@ -136,6 +202,3 @@ table th { transform: rotate(45deg); } -.workspace-link { - margin-right: 4px; -} \ No newline at end of file diff --git a/vscode4teaching-extension/resources/dashboard/dashboard.js b/vscode4teaching-extension/resources/dashboard/dashboard.js index 4172f5f4..88f0655a 100644 --- a/vscode4teaching-extension/resources/dashboard/dashboard.js +++ b/vscode4teaching-extension/resources/dashboard/dashboard.js @@ -1,20 +1,6 @@ // For security reasons, we must keep the VS Code API object private and make sure it is never leaked into the global scope. (function () { const vscode = acquireVsCodeApi(); - // const selectTimeReload = document.getElementById("time-reload"); - // selectTimeReload.addEventListener("change", () => { - // const timeSelected = selectTimeReload.value; - // vscode.postMessage({ - // type: "changeReloadTime", - // reloadTime: timeSelected - // }); - // }); - // document.getElementById("button-reload").addEventListener("click", () => { - // vscode.postMessage({ - // type: "reload", - // reload: true - // }); - // }); window.addEventListener('message', event => { const message = event.data; @@ -32,43 +18,54 @@ } }) - document.querySelectorAll(".workspace-link").forEach((row) => { - row.addEventListener("click", () => { - document.querySelectorAll(".button-col > button").forEach((e) => { + document.querySelectorAll(".workspace-link-open").forEach((openBtn) => { + openBtn.addEventListener("click", () => { + Array.from(openBtn.parentElement.children).forEach((e) => { e.disabled = true; }); - const username = Array.from(row.parentElement.parentElement.children).find(e => e.classList.contains('username')).innerHTML; + const username = openBtn.parentElement.dataset.username; + const eui = openBtn.parentElement.dataset.eui; vscode.postMessage({ type: "goToWorkspace", username: username, + eui: eui, }); }); }); - document.querySelectorAll(".workspace-link-diff").forEach((row) => { - row.addEventListener("click", () => { - Array.from(row.parentElement.children).forEach((e) => { + document.querySelectorAll(".workspace-link-diff").forEach((diffBtn) => { + diffBtn.addEventListener("click", () => { + Array.from(diffBtn.parentElement.children).forEach((e) => { e.disabled = true; }); - const username = Array.from(row.parentElement.parentElement.children).find(e => e.classList.contains('username')).innerHTML; + const username = diffBtn.parentElement.dataset.username; + const eui = diffBtn.parentElement.dataset.eui; vscode.postMessage({ type: "diff", username: username, + eui: eui, }); }); }); document.querySelectorAll(".sorter").forEach( - (header, i) => { + (header) => { header.addEventListener("click", () => { let order = header.classList.toggle('active'); vscode.postMessage({ type: "sort", - column: i, + column: header.dataset.column, desc: order, }); }); } ); + + document.getElementById("hideStudentNames").addEventListener("click", (event) => { + vscode.postMessage({ + type: "changeVisibilityStudentsNames", + value: event.target.checked, + }); + }); }()); diff --git a/vscode4teaching-extension/resources/light/add_multiple.png b/vscode4teaching-extension/resources/light/add_multiple.png new file mode 100644 index 00000000..f2886a74 Binary files /dev/null and b/vscode4teaching-extension/resources/light/add_multiple.png differ diff --git a/vscode4teaching-extension/src/client/APIClient.ts b/vscode4teaching-extension/src/client/APIClient.ts index 8e5945d9..3ae47a5e 100644 --- a/vscode4teaching-extension/src/client/APIClient.ts +++ b/vscode4teaching-extension/src/client/APIClient.ts @@ -59,30 +59,40 @@ class APIClientSingleton { } /** - * Signs up in V4T server. - * @param userCredentials User to sign up - * @param url Server URL. Ignored if trying to sign up a teacher. - * @param isTeacher Sign up as teacher (or not) + * Sign up in V4T server for students. + * @param userCredentials User to sign up. */ - public async signUpV4T(userCredentials: UserSignup, isTeacher?: boolean) { + public async signUpStudent(userCredentials: UserSignup) { try { - if (!isTeacher) { - APIClientSession.invalidateSession(); - await APIClient.getXSRFToken(); - } - let signupThenable; - if (isTeacher) { - signupThenable = APIClient.signUpTeacher(userCredentials); - } else { - signupThenable = APIClient.signUp(userCredentials); - } - const response = await signupThenable; + APIClientSession.invalidateSession(); + await APIClient.getXSRFToken(); + const response = await APIClient.signUp(userCredentials); console.debug(response); - if (isTeacher) { - vscode.window.showInformationMessage("Teacher signed up successfully."); - } else { - vscode.window.showInformationMessage("Signed up. Please log in."); - } + vscode.window.showInformationMessage("Signed up. Please log in."); + } catch (error) { + APIClient.handleAxiosError(error); + } + } + + /** + * Invitation for new teachers in V4T Server. + * @param userCredentials Invited teacher's credentials. + */ + public async signUpTeacher(userCredentials: UserSignup) { + try { + const response = await APIClient.inviteTeacher(userCredentials); + console.debug(response); + const link = APIClientSession.baseUrl + "/app/teacher/sign-up/" + response.data.password; + const windowMessage = vscode.window.showInformationMessage( + "The new teacher has been successfully invited! Copy the link and share it with they to finish the process:\n" + link, + "Copy link" + ).then((clicked) => { + if (clicked) { + vscode.env.clipboard.writeText(link).then(() => { + vscode.window.showInformationMessage("Copied to clipboard."); + }); + } + }); } catch (error) { APIClient.handleAxiosError(error); } @@ -201,14 +211,14 @@ class APIClientSingleton { return APIClient.createRequest(options, "Deleting course..."); } - public addExercise(id: number, data: ExerciseEdit): AxiosPromise { + public addExercises(courseId: number, exercisesData: ExerciseEdit[]): AxiosPromise { const options: AxiosBuildOptions = { - url: "/api/courses/" + id + "/exercises", + url: "/api/v2/courses/" + courseId + "/exercises", method: "POST", responseType: "json", - data, + data: exercisesData, }; - return APIClient.createRequest(options, "Adding exercise..."); + return APIClient.createRequest(options, "Adding new exercises..."); } public editExercise(id: number, data: ExerciseEdit): AxiosPromise { @@ -221,7 +231,7 @@ class APIClientSingleton { return APIClient.createRequest(options, "Sending exercise info..."); } - public uploadExerciseTemplate(id: number, data: Buffer): AxiosPromise { + public uploadExerciseTemplate(id: number, data: Buffer, showNotification?: boolean): AxiosPromise { const dataForm = new FormData(); dataForm.append("file", data, { filename: "template.zip" }); const options: AxiosBuildOptions = { @@ -230,7 +240,7 @@ class APIClientSingleton { responseType: "json", data: dataForm, }; - return APIClient.createRequest(options, "Uploading template...", true); + return APIClient.createRequest(options, "Uploading template...", showNotification ?? true); } public deleteExercise(id: number): AxiosPromise { @@ -383,7 +393,7 @@ class APIClientSingleton { public getCourseWithCode(code: string): AxiosPromise { const options: AxiosBuildOptions = { url: "/api/courses/code/" + code, - method: "GET", + method: "PUT", responseType: "json", }; return APIClient.createRequest(options, "Fetching course data..."); @@ -430,14 +440,14 @@ class APIClientSingleton { return APIClient.createRequest(options, "Signing up to VS Code 4 Teaching..."); } - private signUpTeacher(credentials: UserSignup): AxiosPromise { + private inviteTeacher(credentials: UserSignup): AxiosPromise { const options: AxiosBuildOptions = { - url: "/api/teachers/register", + url: "/api/teachers/invitation", method: "POST", responseType: "json", data: credentials, }; - return APIClient.createRequest(options, "Signing teacher up to VS Code 4 Teaching..."); + return APIClient.createRequest(options, "Inviting teacher to VS Code 4 Teaching..."); } /** @@ -476,7 +486,7 @@ class APIClientSingleton { }; const response = await APIClient.createRequest(options, "Fetching server info..."); console.debug(response); - const cookiesString: string | undefined = response.headers["set-cookie"][0]; + const cookiesString: string | undefined = response.headers["set-cookie"]?.[0]; if (cookiesString) { const cookies = cookiesString.split(";"); const xsrfCookie = cookies.find((cookie) => cookie.includes("XSRF-TOKEN")); diff --git a/vscode4teaching-extension/src/components/courses/CoursesTreeProvider.ts b/vscode4teaching-extension/src/components/courses/CoursesTreeProvider.ts index 8db7279d..e2bd5478 100644 --- a/vscode4teaching-extension/src/components/courses/CoursesTreeProvider.ts +++ b/vscode4teaching-extension/src/components/courses/CoursesTreeProvider.ts @@ -12,6 +12,8 @@ import { V4TBuildItems } from "./V4TItem/V4TBuiltItems"; import { V4TItem } from "./V4TItem/V4TItem"; import { V4TItemType } from "./V4TItem/V4TItemType"; import { Validators } from "./Validators"; +import * as fs from "fs"; +import * as path from "path"; /** * Tree view that lists extension's basic options like: @@ -106,9 +108,8 @@ export class CoursesProvider implements vscode.TreeDataProvider { /** * Show form for signing up then call client. - * @param isTeacher sign up as teacher if true, else sign up as student. */ - public async signup(isTeacher?: boolean) { + public async signup() { let userCredentials: UserSignup = { username: "", password: "", @@ -134,7 +135,7 @@ export class CoursesProvider implements vscode.TreeDataProvider { const lastName = await this.getInput("Last name", Validators.validateLastName); if (lastName) { userCredentials = Object.assign(userCredentials, { lastName }); - await APIClient.signUpV4T(userCredentials, isTeacher); + await APIClient.signUpStudent(userCredentials); } } } @@ -142,6 +143,36 @@ export class CoursesProvider implements vscode.TreeDataProvider { } } } + + /** + * Show form for inviting a new teacher (must be performed by other teacher). + */ + public async inviteTeacher() { + let userCredentials: UserSignup = { + username: "", + email: "", + name: "", + lastName: "", + }; + const firstname = await this.getInput("First name", Validators.validateName); + if (firstname) { + userCredentials.name = firstname; + const lastname = await this.getInput("Last name", Validators.validateLastName); + if (lastname) { + userCredentials.lastName = lastname; + const username = await this.getInput("Username", Validators.validateUsername); + if (username) { + userCredentials.username = username; + const email = await this.getInput("E-mail", Validators.validateEmail); + if (email) { + userCredentials.email = email; + await APIClient.signUpTeacher(userCredentials); + } + } + } + } + } + /** * Log out current user. */ @@ -166,7 +197,6 @@ export class CoursesProvider implements vscode.TreeDataProvider { // Only axios requests throw error APIClient.handleAxiosError(error); } - } /** @@ -198,7 +228,7 @@ export class CoursesProvider implements vscode.TreeDataProvider { if (item.item && instanceOfCourse(item.item)) { try { const selectedOption = await vscode.window.showWarningMessage("Are you sure you want to delete " + item.item.name + "?", { modal: true }, "Accept"); - if ((selectedOption === "Accept") && CurrentUser.isLoggedIn() && CurrentUser.getUserInfo().courses) { + if (selectedOption === "Accept" && CurrentUser.isLoggedIn() && CurrentUser.getUserInfo().courses) { const response = await APIClient.deleteCourse(item.item.id); console.debug(response); await CurrentUser.updateUserInfo(); @@ -254,17 +284,17 @@ export class CoursesProvider implements vscode.TreeDataProvider { try { this.loading = true; CoursesProvider.triggerTreeReload(); - const addExerciseData = await APIClient.addExercise(course.id, { name }); + const addExerciseData = await APIClient.addExercises(course.id, [{ name }]); console.debug(addExerciseData); try { // When exercise is createdupload template const zipContent = await FileZipUtil.getZipFromUris(fileUris); - const response = await APIClient.uploadExerciseTemplate(addExerciseData.data.id, zipContent); + const response = await APIClient.uploadExerciseTemplate(addExerciseData.data[0].id, zipContent); console.debug(response); } catch (uploadError) { try { // If upload fails delete the exercise and show error - const response = await APIClient.deleteExercise(addExerciseData.data.id); + const response = await APIClient.deleteExercise(addExerciseData.data[0].id); console.debug(response); APIClient.handleAxiosError(uploadError); } catch (deleteError) { @@ -273,6 +303,7 @@ export class CoursesProvider implements vscode.TreeDataProvider { } finally { this.loading = false; CoursesProvider.triggerTreeReload(); + vscode.window.showInformationMessage("Exercise added."); } } catch (error) { APIClient.handleAxiosError(error); @@ -282,6 +313,65 @@ export class CoursesProvider implements vscode.TreeDataProvider { } } + /** + * Prepare and send multiple exercises' creation request + * @param item course + */ + public async addMultipleExercises(item: V4TItem) { + if (item.item && instanceOfCourse(item.item)) { + const course = item.item; + // Explain user how to organize their exercises' directory + vscode.window.showInformationMessage("To upload multiple exercises, prepare a directory with a folder for each exercise, each folder including the exercise's corresponding template. When ready, click 'Accept'.", "Accept").then(async (ans) => { + if (ans === "Accept") { + // Ask user to select a directory + // This directory has to contain exercises (1 folder = 1 new exercise) + const parentDirectoryUri = await vscode.window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + openLabel: "Select directory", + }); + if (parentDirectoryUri) { + const fsUri = parentDirectoryUri[0].fsPath; + // Get every folder from a selected directory + const exercisesDirectories = fs.readdirSync(fsUri, { withFileTypes: true }).filter((d) => d.isDirectory()); + // Get the number of directories + const availableFolderNumber = exercisesDirectories.length; + // Prepare count of successfully uploaded exercises + let uploadedExercises = 0; + // Unsuccessful responses' control (true if there were any) + let errorCaught = false; + if (exercisesDirectories.length > 1) { + // Exercises are uploaded in batches of 3 exercises + while (exercisesDirectories.length > 0) { + const exercisesDirChunk = exercisesDirectories.splice(0, 3); + // Collect exercises' names from directories' names + const exerciseData = await APIClient.addExercises( + course.id, + exercisesDirChunk.map((d) => ({ name: d.name })) + ); + + // When added to DB, templates of each exercise are sent + exerciseData.data.map(async (ex, index) => { + APIClient.uploadExerciseTemplate(ex.id, await FileZipUtil.getZipFromUris([vscode.Uri.parse(fsUri + path.sep + exercisesDirChunk[index].name)]), false) + .then((_) => uploadedExercises++) + .catch((_) => (errorCaught = true)); + }); + } + if (errorCaught || availableFolderNumber !== uploadedExercises) { + vscode.window.showInformationMessage("All exercises were successfully uploaded."); + } else { + vscode.window.showErrorMessage("One or more exercises were not properly uploaded."); + } + } else { + vscode.window.showErrorMessage("No exercises have been uploaded since there were not any to upload in the selected folder."); + } + } + } + }); + } + } + /** * Show form for editing an exercise then call client. * @param item exercise @@ -488,7 +578,7 @@ export class CoursesProvider implements vscode.TreeDataProvider { * @param validator validator (check model/Validators.ts) * @param options available options for input box */ - private async getInput(prompt: string, validator: ((value: string) => string | undefined | null | Thenable), options?: { value?: string, password?: boolean }) { + private async getInput(prompt: string, validator: (value: string) => string | undefined | null | Thenable, options?: { value?: string; password?: boolean }) { let inputOptions: vscode.InputBoxOptions = { prompt }; if (options) { if (options.value) { diff --git a/vscode4teaching-extension/src/components/courses/V4TItem/V4TBuiltItems.ts b/vscode4teaching-extension/src/components/courses/V4TItem/V4TBuiltItems.ts index f2889ba6..0c481307 100644 --- a/vscode4teaching-extension/src/components/courses/V4TItem/V4TBuiltItems.ts +++ b/vscode4teaching-extension/src/components/courses/V4TItem/V4TBuiltItems.ts @@ -16,9 +16,9 @@ export class V4TBuildItems { command: "vscode4teaching.signup", title: "Sign up in VS Code 4 Teaching", }); - public static readonly SIGNUP_TEACHER_ITEM = new V4TItem("Sign up a teacher", V4TItemType.SignupTeacher, TreeItemCollapsibleState.None, undefined, undefined, { + public static readonly SIGNUP_TEACHER_ITEM = new V4TItem("Invite a teacher", V4TItemType.SignupTeacher, TreeItemCollapsibleState.None, undefined, undefined, { command: "vscode4teaching.signupteacher", - title: "Sign up in VS Code 4 Teaching", + title: "Invite a teacher to join VS Code 4 Teaching", }); public static readonly LOGOUT_ITEM = new V4TItem("Logout", V4TItemType.Logout, TreeItemCollapsibleState.None, undefined, undefined, { command: "vscode4teaching.logout", @@ -30,5 +30,4 @@ export class V4TBuildItems { }); public static readonly NO_COURSES_ITEM = new V4TItem("No courses available", V4TItemType.NoCourses, TreeItemCollapsibleState.None); public static readonly NO_EXERCISES_ITEM = new V4TItem("No exercises available", V4TItemType.NoExercises, TreeItemCollapsibleState.None); - } diff --git a/vscode4teaching-extension/src/components/dashboard/DashboardWebview.ts b/vscode4teaching-extension/src/components/dashboard/DashboardWebview.ts index 241491a9..e292b94d 100644 --- a/vscode4teaching-extension/src/components/dashboard/DashboardWebview.ts +++ b/vscode4teaching-extension/src/components/dashboard/DashboardWebview.ts @@ -13,14 +13,10 @@ export class DashboardWebview { public static readonly viewType = "v4tdashboard"; - public static readonly resourcesPath = __dirname.includes(path.sep + "out") ? - path.join(__dirname, "..", "resources", "dashboard") : - path.join(__dirname, "..", "..", "..", "resources", "dashboard"); + public static readonly resourcesPath = __dirname.includes(path.sep + "out") ? path.join(__dirname, "..", "resources", "dashboard") : path.join(__dirname, "..", "..", "..", "resources", "dashboard"); public static show(euis: ExerciseUserInfo[], course: Course, exercise: Exercise) { - const column = vscode.window.activeTextEditor - ? vscode.window.activeTextEditor.viewColumn - : undefined; + const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined; // If we already have a panel, show it. if (DashboardWebview.currentPanel) { @@ -30,21 +26,17 @@ export class DashboardWebview { // Otherwise, create a new panel. const dashboardName = exercise.name; + const dashboardViewName = course.name + " - " + exercise.name; - const panel = vscode.window.createWebviewPanel( - DashboardWebview.viewType, - "V4T Dashboard: " + dashboardName, - column || vscode.ViewColumn.One, - { - // Enable javascript in the webview - enableScripts: true, + const panel = vscode.window.createWebviewPanel(DashboardWebview.viewType, "V4T Dashboard: " + dashboardName, column || vscode.ViewColumn.One, { + // Enable javascript in the webview + enableScripts: true, - // And restrict the webview to only loading content from our extension's `resources` directory. - localResourceRoots: [vscode.Uri.file(DashboardWebview.resourcesPath)], - }, - ); + // And restrict the webview to only loading content from our extension's `resources` directory. + localResourceRoots: [vscode.Uri.file(DashboardWebview.resourcesPath)], + }); - DashboardWebview.currentPanel = new DashboardWebview(panel, dashboardName, euis, course, exercise); + DashboardWebview.currentPanel = new DashboardWebview(panel, dashboardName, dashboardViewName, euis, course, exercise); } public readonly panel: vscode.WebviewPanel; @@ -52,18 +44,22 @@ export class DashboardWebview { private ws: WebSocketV4TConnection; private readonly _dashboardName: string; + private readonly _dashboardViewName: string; private _euis: ExerciseUserInfo[]; // private _reloadInterval: NodeJS.Timeout | undefined; private lastUpdatedInterval: NodeJS.Timeout; private _exercise: Exercise; private sortAsc: boolean; + private hiddenStudentNames: boolean; - private constructor(panel: vscode.WebviewPanel, dashboardName: string, euis: ExerciseUserInfo[], course: Course, exercise: Exercise) { + private constructor(panel: vscode.WebviewPanel, dashboardName: string, dashboardViewName: string, euis: ExerciseUserInfo[], course: Course, exercise: Exercise) { this.panel = panel; this._dashboardName = dashboardName; + this._dashboardViewName = dashboardViewName; this._euis = euis; this._exercise = exercise; this.sortAsc = false; + this.hiddenStudentNames = false; // Set the webview's initial html content this.updateHtml(); @@ -80,13 +76,11 @@ export class DashboardWebview { }); // Update the content based on view changes - this.panel.onDidChangeViewState( - (e) => { - if (this.panel.visible) { - this.updateHtml(); - } - }, - ); + this.panel.onDidChangeViewState((e) => { + if (this.panel.visible) { + this.updateHtml(); + } + }); this.panel.webview.onDidReceiveMessage(async (message) => { switch (message.type) { case "reload": { @@ -108,29 +102,33 @@ export class DashboardWebview { // break; // } case "goToWorkspace": { - this.showQuickPick(message.username, course, exercise).then(async (filePath) => { - if (filePath !== undefined) { - const doc1 = await vscode.workspace.openTextDocument(filePath); - await vscode.window.showTextDocument(doc1); - } - this.panel.webview.postMessage({ type: "openDone", username: message.username }); - }).catch((err) => { - console.error(err); - vscode.window.showErrorMessage(err); - }); + this.showQuickPick(message.username, course, exercise, message.eui) + .then(async (filePath) => { + if (filePath !== undefined) { + const doc1 = await vscode.workspace.openTextDocument(filePath); + await vscode.window.showTextDocument(doc1); + } + this.panel.webview.postMessage({ type: "openDone", username: message.username }); + }) + .catch((err) => { + console.error(err); + vscode.window.showErrorMessage(err); + }); break; } case "diff": { - this.showQuickPick(message.username, course, exercise).then(async (filePath) => { - if (filePath !== undefined) { - await vscode.commands.executeCommand("vscode4teaching.diff", filePath); - } - this.panel.webview.postMessage({ type: "openDone", username: message.username }); - }).catch((err) => { - console.error(err); - vscode.window.showErrorMessage(err); - }); + this.showQuickPick(message.username, course, exercise, message.eui) + .then(async (filePath) => { + if (filePath !== undefined) { + await vscode.commands.executeCommand("vscode4teaching.diff", filePath); + } + this.panel.webview.postMessage({ type: "openDone", username: message.username }); + }) + .catch((err) => { + console.error(err); + vscode.window.showErrorMessage(err); + }); break; } @@ -138,53 +136,68 @@ export class DashboardWebview { this.sortAsc = message.desc; const weight = this.sortAsc ? 1 : -1; switch (message.column) { - case 0: { + case "fullName": { this._euis.sort((a, b) => { - - const aname = ((a.user.name) ? a.user.name : "") + " " + ((a.user.lastName) ? a.user.lastName : ""); - const bname = ((b.user.name) ? b.user.name : "") + " " + ((b.user.lastName) ? b.user.lastName : ""); + const aname = (a.user.name ? a.user.name : "") + " " + (a.user.lastName ? a.user.lastName : ""); + const bname = (b.user.name ? b.user.name : "") + " " + (b.user.lastName ? b.user.lastName : ""); if (aname > bname) { return -1 * weight; - } else if (a.user.username < b.user.username) { + } else if (aname < bname) { return 1 * weight; - } else { return 0; } + } else { + return 0; + } }); break; } - case 1: { + case "exerciseFolder": { this._euis.sort((a, b) => { - if (a.user.username > b.user.username) { + const adirectory = "student_" + a.id; + const bdirectory = "student_" + b.id; + if (adirectory > bdirectory) { return -1 * weight; - } else if (a.user.username < b.user.username) { + } else if (adirectory < bdirectory) { return 1 * weight; - } else { return 0; } + } else { + return 0; + } }); break; } - case 2: { + case "status": { this._euis.sort((a, b) => { if (a.status > b.status) { return -1 * weight; - } else if (a.user.username < b.user.username) { + } else if (a.status < b.status) { return 1 * weight; - } else { return 0; } + } else { + return 0; + } }); break; } - case 3: { + case "lastModification": { this._euis.sort((a, b) => { if (a.updateDateTime > b.updateDateTime) { return -1 * weight; } else if (a.updateDateTime < b.updateDateTime) { return 1 * weight; - } else { return 0; } + } else { + return 0; + } }); } } this.updateHtml(); break; } + + case "changeVisibilityStudentsNames": { + this.hiddenStudentNames = message.value; + this.updateHtml(); + break; + } } }); this.ws = new WebSocketV4TConnection("dashboard-refresh", (dataStringified) => { @@ -214,8 +227,10 @@ export class DashboardWebview { this.panel.webview.postMessage({ type: "updateDate", update: message }); } - private async findLastModifiedFile(folder: vscode.WorkspaceFolder, fileRoute: string): Promise<{ uri: vscode.Uri, relativePath: string }> { - if (fileRoute === "null") { return this.findMainFile(folder); } + private async findLastModifiedFile(folder: vscode.WorkspaceFolder, fileRoute: string): Promise<{ uri: vscode.Uri; relativePath: string }> { + if (fileRoute === "null") { + return this.findMainFile(folder); + } const fileRegex = /^\/[^\/]+\/[^\/]+\/[^\/]+\/(.+)$/; const regexResults = fileRegex.exec(fileRoute); @@ -228,7 +243,7 @@ export class DashboardWebview { return this.findMainFile(folder); } - private async findMainFile(folder: vscode.WorkspaceFolder): Promise<{ uri: vscode.Uri, relativePath: string }> { + private async findMainFile(folder: vscode.WorkspaceFolder): Promise<{ uri: vscode.Uri; relativePath: string }> { const patterns = ["readme.*", "readme", "Main.*", "main.*", "index.html", "*"]; let matches: vscode.Uri[] = []; let i = 0; @@ -236,20 +251,22 @@ export class DashboardWebview { while (matches.length <= 0 && i < patterns.length) { pattern = patterns[i++]; const file = new vscode.RelativePattern(folder, pattern); - matches = (await vscode.workspace.findFiles(file)); + matches = await vscode.workspace.findFiles(file); } if (matches.length <= 0) { - matches = (await vscode.workspace.findFiles(new vscode.RelativePattern(folder, "*"))); + matches = await vscode.workspace.findFiles(new vscode.RelativePattern(folder, "*")); } return { uri: matches[0], relativePath: pattern }; } private reloadData() { - APIClient.getAllStudentsExerciseUserInfo(this._exercise.id).then((response: AxiosResponse) => { - console.debug(response); - this._euis = response.data; - this.updateHtml(); - }).catch((error) => APIClient.handleAxiosError(error)); + APIClient.getAllStudentsExerciseUserInfo(this._exercise.id) + .then((response: AxiosResponse) => { + console.debug(response); + this._euis = response.data; + this.updateHtml(); + }) + .catch((error) => APIClient.handleAxiosError(error)); } private updateHtml() { @@ -258,16 +275,12 @@ export class DashboardWebview { private getHtmlForWebview() { // Local path to main script run in the webview - const scriptPath = vscode.Uri.file( - path.join(DashboardWebview.resourcesPath, "dashboard.js"), - ); + const scriptPath = vscode.Uri.file(path.join(DashboardWebview.resourcesPath, "dashboard.js")); // And the uri we use to load this script in the webview const scriptUri = this.panel.webview.asWebviewUri(scriptPath); // Local path to styles - const cssPath = vscode.Uri.file( - path.join(DashboardWebview.resourcesPath, "dashboard.css"), - ); + const cssPath = vscode.Uri.file(path.join(DashboardWebview.resourcesPath, "dashboard.css")); // Styles uri const cssUri = this.panel.webview.asWebviewUri(cssPath); @@ -277,13 +290,14 @@ export class DashboardWebview { // for (const eui of this._euis) { for (const eui of this._euis) { rows = rows + "\n"; - if (eui.user.name && eui.user.lastName) { - rows = rows + "" + eui.user.name + " " + eui.user.lastName + "\n"; - } else { - rows = rows + ""; + if (!this.hiddenStudentNames) { + if (eui.user.name && eui.user.lastName) { + rows = rows + "" + eui.user.name + " " + eui.user.lastName + "\n"; + } else { + rows = rows + ""; + } } - rows = rows + "" + eui.user.username + "\n"; - + rows = rows + `student_${eui.id}\n`; switch (eui.status) { case 0: { // not started @@ -301,13 +315,12 @@ export class DashboardWebview { break; } } - rows = rows + ``; - const buttons = ``; + rows = rows + ``; + const buttons = ``; rows += buttons; rows = rows + `\n`; - rows = rows + `${this.getElapsedTime(eui.updateDateTime)}\n`; + rows = rows + `${this.getElapsedTime(eui.updateDateTime)}\n`; rows = rows + "\n"; - } // Use a nonce to whitelist which scripts can be run @@ -322,45 +335,45 @@ export class DashboardWebview { -

Exercise dashboard

-
- -
+
- - ` + : "" + } +
Full name - + ${ + !this.hiddenStudentNames + ? `Full name + - Username - + Exercise folder + Exercise status - + Last modified file Last modification - + @@ -370,7 +383,7 @@ export class DashboardWebview {
- `; + `; } private getNonce() { @@ -383,23 +396,33 @@ export class DashboardWebview { } private getElapsedTime(pastDateStr: string) { - if (!pastDateStr) { return "-"; } + if (!pastDateStr) { + return "-"; + } pastDateStr += "Z"; let elapsedTime = (new Date().getTime() - new Date(pastDateStr).getTime()) / 1000; - if (elapsedTime < 0) { elapsedTime = 0; } + if (elapsedTime < 0) { + elapsedTime = 0; + } let unit = "s"; if (elapsedTime > 60) { - elapsedTime /= 60; // convert to minutes + elapsedTime /= 60; // convert to minutes if (elapsedTime > 60) { - elapsedTime /= 60; // convert to hours + elapsedTime /= 60; // convert to hours if (elapsedTime > 24) { - elapsedTime /= 24; // convert to days + elapsedTime /= 24; // convert to days if (elapsedTime > 365) { - elapsedTime /= 365; // convert to years + elapsedTime /= 365; // convert to years unit = "yr"; - } else { unit = "d"; } - } else { unit = "h"; } - } else { unit = "min"; } + } else { + unit = "d"; + } + } else { + unit = "h"; + } + } else { + unit = "min"; + } } return `${Math.floor(elapsedTime)} ${unit}`; @@ -412,31 +435,37 @@ export class DashboardWebview { * @param exercise Exercise exercise * @returns Thenable the selected file */ - private async showQuickPick(username: string, course: Course, exercise: Exercise): Promise { + private async showQuickPick(username: string, course: Course, exercise: Exercise, eui_id: number): Promise { // Download most recent files await vscode.commands.executeCommand("vscode4teaching.getstudentfiles", course.name, exercise); - return vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - cancellable: false, - title: "Getting modified files...", - }, (progress, token) => this.buildQuickPickItems(username)) - .then(async (result: OpenQuickPick[]) => { - if (result) { - const selection = await this.showQuickPickRecursive(result); - if (selection) { - return selection; + return vscode.window + .withProgress( + { + location: vscode.ProgressLocation.Notification, + cancellable: false, + title: "Getting modified files...", + }, + (progress, token) => this.buildQuickPickItems(username, eui_id) + ) + .then(async (result: OpenQuickPick[]) => { + if (result) { + const selection = await this.showQuickPickRecursive(result); + if (selection) { + return selection; + } } - } - }); + }); } - private async buildQuickPickItems(username: string): Promise { + private async buildQuickPickItems(username: string, eui_id: number): Promise { // Find all modified files URIs (paths) const workspaces = vscode.workspace.workspaceFolders; if (workspaces) { - const wsF = workspaces.find((e) => e.name === username); + const wsF = workspaces.find((e) => e.name === "student_" + eui_id.toString()); if (wsF) { - const euis = this._euis.filter((eui) => eui.user.username === username); + const euis = this._euis.filter((eui) => { + return eui.id.toString() === eui_id.toString(); + }); const uris: vscode.Uri[] = []; const relativePaths: string[] = []; if (euis.length > 0) { @@ -484,7 +513,7 @@ export class DashboardWebview { // Combines parent and child as a single path if there is only one child and it is a directory private shortenPaths(item: OpenQuickPick) { - if ((item.children.length === 1) && (item.children[0].children.length > 0)) { + if (item.children.length === 1 && item.children[0].children.length > 0) { const child = item.children[0]; item.name = item.name + "/" + child.name; item.children = child.children; diff --git a/vscode4teaching-extension/src/extension.ts b/vscode4teaching-extension/src/extension.ts index 9b375fa2..47541964 100644 --- a/vscode4teaching-extension/src/extension.ts +++ b/vscode4teaching-extension/src/extension.ts @@ -27,6 +27,9 @@ import { TeacherCommentService } from "./services/TeacherCommentsService"; import { FileIgnoreUtil } from "./utils/FileIgnoreUtil"; import { FileZipUtil } from "./utils/FileZipUtil"; +// Base URL of server +const getServerBaseUrl = () => vscode.workspace.getConfiguration("vscode4teaching").get("defaultServer"); + /** * Entrypoiny of the extension. * Activate is called at start. @@ -83,7 +86,7 @@ export function activate(context: vscode.ExtensionContext) { coursesProvider.logout(); if (showLiveshareBoardItem) { showLiveshareBoardItem.dispose(); - showDashboardItem = undefined; + showLiveshareBoardItem = undefined; } if (showDashboardItem) { showDashboardItem.dispose(); @@ -137,6 +140,10 @@ export function activate(context: vscode.ExtensionContext) { coursesProvider.addExercise(item); }); + const addMultipleExercises = vscode.commands.registerCommand("vscode4teaching.addmultipleexercises", (item: V4TItem) => { + coursesProvider.addMultipleExercises(item); + }); + const editExercise = vscode.commands.registerCommand("vscode4teaching.editexercise", (item: V4TItem) => { coursesProvider.editExercise(item); }); @@ -158,10 +165,10 @@ export function activate(context: vscode.ExtensionContext) { if (wf) { const parentDir = path.resolve(wf.uri.fsPath, ".."); const relativePath = path.relative(wf.uri.fsPath, file.fsPath); - const templateFile = path.resolve(templates[parentDir], relativePath); + const templateFile = path.resolve(parentDir, "template", relativePath); if (fs.existsSync(templateFile)) { const templateFileUri = vscode.Uri.file(templateFile); - vscode.commands.executeCommand("vscode.diff", templateFileUri, file); + vscode.commands.executeCommand("vscode.diff", file, templateFileUri); } else { vscode.window.showErrorMessage("File doesn't exist in the template."); } @@ -203,13 +210,10 @@ export function activate(context: vscode.ExtensionContext) { const codeThenable = APIClient.getSharingCode(item.item); codeThenable.then((response) => { console.debug(response); - const code = response.data; - vscode.window.showInformationMessage( - "Share this code with your students to give them access to this course:\n" + code, - "Copy to clipboard", - ).then((clicked) => { + const link = `${getServerBaseUrl()}/app?code=${response.data}`; + vscode.window.showInformationMessage("Share this link with your students to give them access to this course:\n" + link, "Copy link").then((clicked) => { if (clicked) { - vscode.env.clipboard.writeText(code).then(() => { + vscode.env.clipboard.writeText(link).then(() => { vscode.window.showInformationMessage("Copied to clipboard"); }); } @@ -223,7 +227,7 @@ export function activate(context: vscode.ExtensionContext) { }); const signupTeacher = vscode.commands.registerCommand("vscode4teaching.signupteacher", () => { - coursesProvider.signup(true).catch((error) => APIClient.handleAxiosError(error)); + coursesProvider.inviteTeacher().catch((error) => APIClient.handleAxiosError(error)); }); const getWithCode = vscode.commands.registerCommand("vscode4teaching.getwithcode", async () => { @@ -233,11 +237,11 @@ export function activate(context: vscode.ExtensionContext) { const finishExercise = vscode.commands.registerCommand("vscode4teaching.finishexercise", async () => { const warnMessage = "Finish exercise? Exercise will be marked as finished and you will not be able to upload any more updates"; const selectedOption = await vscode.window.showWarningMessage(warnMessage, { modal: true }, "Accept"); - if ((selectedOption === "Accept") && finishItem) { + if (selectedOption === "Accept" && finishItem) { try { const response = await APIClient.updateExerciseUserInfo(finishItem.getExerciseId(), 1); console.debug(response); - if ((response.data.status === 1) && finishItem) { + if (response.data.status === 1 && finishItem) { finishItem.dispose(); if (changeEvent) { changeEvent.dispose(); @@ -259,12 +263,14 @@ export function activate(context: vscode.ExtensionContext) { const showDashboard = vscode.commands.registerCommand("vscode4teaching.showdashboard", () => { if (showDashboardItem && showDashboardItem.exercise && showDashboardItem.course) { - APIClient.getAllStudentsExerciseUserInfo(showDashboardItem.exercise.id).then((response: AxiosResponse) => { - console.debug(response); - if (showDashboardItem && showDashboardItem.exercise && showDashboardItem.course) { - DashboardWebview.show(response.data, showDashboardItem.course, showDashboardItem.exercise); - } - }).catch((error) => APIClient.handleAxiosError(error)); + APIClient.getAllStudentsExerciseUserInfo(showDashboardItem.exercise.id) + .then((response: AxiosResponse) => { + console.debug(response); + if (showDashboardItem && showDashboardItem.exercise && showDashboardItem.course) { + DashboardWebview.show(response.data, showDashboardItem.course, showDashboardItem.exercise); + } + }) + .catch((error) => APIClient.handleAxiosError(error)); } }); @@ -279,15 +285,40 @@ export function activate(context: vscode.ExtensionContext) { } LiveshareWebview.show(courses); } - } catch (err) { console.error(err); } + } catch (err) { + console.error(err); + } } else { vscode.window.showErrorMessage("You are not logged in."); } }); - context.subscriptions.push(loginDisposable, logoutDisposable, getFilesDisposable, addCourseDisposable, editCourseDisposable, - deleteCourseDisposable, refreshView, refreshCourse, addExercise, editExercise, deleteExercise, addUsersToCourse, - removeUsersFromCourse, getStudentFiles, diff, createComment, share, signup, signupTeacher, getWithCode, finishExercise, showDashboard, showLiveshareBoard); + context.subscriptions.push( + loginDisposable, + logoutDisposable, + getFilesDisposable, + addCourseDisposable, + editCourseDisposable, + deleteCourseDisposable, + refreshView, + refreshCourse, + addExercise, + addMultipleExercises, + editExercise, + deleteExercise, + addUsersToCourse, + removeUsersFromCourse, + getStudentFiles, + diff, + createComment, + share, + signup, + signupTeacher, + getWithCode, + finishExercise, + showDashboard, + showLiveshareBoard + ); // Temp fix for this issue https://github.com/microsoft/vscode/issues/136787 // TODO: Remove this when the issue is fixed @@ -296,12 +327,18 @@ export function activate(context: vscode.ExtensionContext) { if (vscode.workspace.getConfiguration("http").get("systemCertificates")) { vscode.window.showWarningMessage("There may be issues connecting to the server unless you change your configuration settings.\nClicking the button will automatically make all configuration changes needed.", "Change configuration and restart").then((selected) => { if (selected) { - vscode.workspace.getConfiguration("http").update("systemCertificates", false, true).then(() => { - vscode.commands.executeCommand("workbench.action.reloadWindow"); - }, (error) => { - console.error(error); - vscode.window.showErrorMessage("There was an error updating your configuration: " + error); - }); + vscode.workspace + .getConfiguration("http") + .update("systemCertificates", false, true) + .then( + () => { + vscode.commands.executeCommand("workbench.action.reloadWindow"); + }, + (error) => { + console.error(error); + vscode.window.showErrorMessage("There was an error updating your configuration: " + error); + } + ); } }); } @@ -333,7 +370,6 @@ export function disableFeatures() { } export async function initializeExtension(cwds: ReadonlyArray, hideWelcomeMessage?: boolean) { - disableFeatures(); const checkedUris: string[] = []; @@ -349,7 +385,7 @@ export async function initializeExtension(cwds: ReadonlyArray { console.log("LiveShare initialized"); @@ -362,7 +398,9 @@ export async function initializeExtension(cwds: ReadonlyArray { - console.debug(value); - if (value === openDashboard) { - console.debug("Opening dashboard"); - return vscode.commands.executeCommand("vscode4teaching.showdashboard"); - } - }).then(() => console.debug("Message dismissed")); + vscode.window + .showInformationMessage(message, openDashboard) + .then((value: string | undefined) => { + console.debug(value); + if (value === openDashboard) { + console.debug("Opening dashboard"); + return vscode.commands.executeCommand("vscode4teaching.showdashboard"); + } + }) + .then(() => console.debug("Message dismissed")); } } }); @@ -487,9 +528,7 @@ function setStudentEvents(jszipFile: JSZip, cwd: vscode.WorkspaceFolder, zipUri: vscode.workspace.onWillSaveTextDocument((e: vscode.TextDocumentWillSaveEvent) => { if (commentProvider && commentProvider.getFileCommentThreads(e.document.uri).length > 0) { - vscode.window.showWarningMessage( - "If you write over a line with comments, the comments could be deleted next time you open VS Code.", - ); + vscode.window.showWarningMessage("If you write over a line with comments, the comments could be deleted next time you open VS Code."); } }); @@ -549,9 +588,7 @@ async function getSingleStudentExerciseFiles(courseName: string, exercise: Exerc initializeExtension(currentCwds, true); } }); - vscode.workspace.updateWorkspaceFolders(0, - vscode.workspace.workspaceFolders ? vscode.workspace.workspaceFolders.length : 0, - { uri, name: exercise.name }); + vscode.workspace.updateWorkspaceFolders(0, vscode.workspace.workspaceFolders ? vscode.workspace.workspaceFolders.length : 0, { uri, name: exercise.name }); } } } @@ -564,18 +601,14 @@ async function getSingleStudentExerciseFiles(courseName: string, exercise: Exerc async function getStudentExerciseFiles(courseName: string, exercise: Exercise) { const studentZipInfo = FileZipUtil.studentZipInfo(courseName, exercise); const templateZipInfo = FileZipUtil.templateZipInfo(courseName, exercise); - return await Promise.all([ - FileZipUtil.filesFromZip(templateZipInfo, APIClient.getTemplate(exercise.id)), - FileZipUtil.filesFromZip(studentZipInfo, APIClient.getAllStudentFiles(exercise.id), templateZipInfo.dir), - ]); + return await Promise.all([FileZipUtil.filesFromZip(templateZipInfo, APIClient.getTemplate(exercise.id)), FileZipUtil.filesFromZip(studentZipInfo, APIClient.getAllStudentFiles(exercise.id), templateZipInfo.dir)]); } async function getMultipleStudentExerciseFiles(courseName: string, exercise: Exercise) { const newWorkspaceURIs = await getStudentExerciseFiles(courseName, exercise); if (newWorkspaceURIs && newWorkspaceURIs[1]) { const wsURI: string = newWorkspaceURIs[1]; - let directories = fs.readdirSync(wsURI, { withFileTypes: true }) - .filter((dirent) => dirent.isDirectory()); + let directories = fs.readdirSync(wsURI, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()); /* Move "template" directory to beginning of directory array As in the documentation for vscode.workspace.onDidChangeWorkspaceFolders: @@ -607,9 +640,7 @@ async function getMultipleStudentExerciseFiles(courseName: string, exercise: Exe } }); // open all student files and template - vscode.workspace.updateWorkspaceFolders(0, - vscode.workspace.workspaceFolders ? vscode.workspace.workspaceFolders.length : 0, - ...subdirectoriesURIs); + vscode.workspace.updateWorkspaceFolders(0, vscode.workspace.workspaceFolders ? vscode.workspace.workspaceFolders.length : 0, ...subdirectoriesURIs); } } } diff --git a/vscode4teaching-extension/src/model/serverModel/exercise/ExerciseUserInfo.ts b/vscode4teaching-extension/src/model/serverModel/exercise/ExerciseUserInfo.ts index ac88deaa..1c4a02f7 100644 --- a/vscode4teaching-extension/src/model/serverModel/exercise/ExerciseUserInfo.ts +++ b/vscode4teaching-extension/src/model/serverModel/exercise/ExerciseUserInfo.ts @@ -2,6 +2,7 @@ import { User } from "../user/User"; import { Exercise } from "./Exercise"; export interface ExerciseUserInfo { + id: number; exercise: Exercise; user: User; status: number; diff --git a/vscode4teaching-extension/src/model/serverModel/user/UserSignup.ts b/vscode4teaching-extension/src/model/serverModel/user/UserSignup.ts index 8a503284..dd93bc35 100644 --- a/vscode4teaching-extension/src/model/serverModel/user/UserSignup.ts +++ b/vscode4teaching-extension/src/model/serverModel/user/UserSignup.ts @@ -1,6 +1,6 @@ export interface UserSignup { username: string; - password: string; + password?: string; email: string; name: string; lastName: string; diff --git a/vscode4teaching-extension/test/unitSuite/Client.test.ts b/vscode4teaching-extension/test/unitSuite/Client.test.ts index 2845ea7b..8e62a1e4 100644 --- a/vscode4teaching-extension/test/unitSuite/Client.test.ts +++ b/vscode4teaching-extension/test/unitSuite/Client.test.ts @@ -50,9 +50,9 @@ describe("Client", () => { APIClient.invalidateSession(); const v4tPath = path.resolve(__dirname, "..", "..", "src", "v4t"); if (fs.existsSync(v4tPath)) { - rimraf(v4tPath, ((error: any) => { + rimraf(v4tPath, (error: any) => { // console.error(error); - })); + }); } mockedAxios.mockReset(); mockedCoursesTreeProvider.mockClear(); @@ -84,8 +84,7 @@ describe("Client", () => { baseURL: newUrl, url: "/api/csrf", method: "GET", - headers: { - }, + headers: {}, responseType: "json", maxContentLength: Infinity, maxBodyLength: Infinity, @@ -96,7 +95,7 @@ describe("Client", () => { method: "POST", headers: { "X-XSRF-TOKEN": newXsrfToken, - "Cookie": "XSRF-TOKEN=" + newXsrfToken, + Cookie: "XSRF-TOKEN=" + newXsrfToken, }, data: { username, @@ -106,20 +105,19 @@ describe("Client", () => { maxContentLength: Infinity, maxBodyLength: Infinity, }; - const expectedAxiosResponseXSRF: AxiosResponse = { // XSRF Token call + const expectedAxiosResponseXSRF: AxiosResponse = { + // XSRF Token call status: 200, statusText: "OK", - headers: { - "set-cookie": ["XSRF-TOKEN=" + newXsrfToken + "; Path=/"], - }, + headers: {}, data: "", config: expectedAxiosConfigXSRFRequest, }; + expectedAxiosResponseXSRF.headers["set-cookie"] = ["XSRF-TOKEN=" + newXsrfToken + "; Path=/"]; const expectedAxiosResponseLogin: AxiosResponse = { status: 200, statusText: "OK", - headers: { - }, + headers: {}, data: { jwtToken: newJwtToken, }, @@ -194,15 +192,15 @@ describe("Client", () => { maxContentLength: Infinity, maxBodyLength: Infinity, }; - const expectedAxiosResponseXSRF: AxiosResponse = { // XSRF Token call + const expectedAxiosResponseXSRF: AxiosResponse = { + // XSRF Token call status: 200, statusText: "OK", - headers: { - "set-cookie": ["XSRF-TOKEN=29f6caf7-b522-4730-87c4-bfb1b3db0e66; Path=/"], - }, + headers: {}, data: "", config: expectedAxiosConfigXSRFRequest, }; + expectedAxiosResponseXSRF.headers["set-cookie"] = ["XSRF-TOKEN=29f6caf7-b522-4730-87c4-bfb1b3db0e66; Path=/"]; mockedAxios .mockRejectedValue("Error in test") // default .mockResolvedValueOnce(expectedAxiosResponseXSRF); @@ -286,8 +284,7 @@ describe("Client", () => { baseURL, url: "/api/csrf", method: "GET", - headers: { - }, + headers: {}, responseType: "json", maxContentLength: Infinity, maxBodyLength: Infinity, @@ -305,20 +302,19 @@ describe("Client", () => { maxContentLength: Infinity, maxBodyLength: Infinity, }; - const expectedAxiosResponseXSRF: AxiosResponse = { // XSRF Token call + const expectedAxiosResponseXSRF: AxiosResponse = { + // XSRF Token call status: 200, statusText: "OK", - headers: { - "set-cookie": ["XSRF-TOKEN=" + newXsrfToken + "; Path=/"], - }, + headers: {}, data: "", config: expectedAxiosConfigXSRFRequest, }; + expectedAxiosResponseXSRF.headers["set-cookie"] = ["XSRF-TOKEN=" + newXsrfToken + "; Path=/"]; const expectedAxiosResponseSignup: AxiosResponse = { status: 200, statusText: "OK", - headers: { - }, + headers: {}, data: { id: 23, email: "johndoe@john.com", @@ -337,7 +333,7 @@ describe("Client", () => { .mockRejectedValue("Error in test") // default .mockResolvedValueOnce(expectedAxiosResponseXSRF) .mockResolvedValueOnce(expectedAxiosResponseSignup); - await APIClient.signUpV4T(userCredentials, false); + await APIClient.signUpStudent(userCredentials); // Fail if errors are thrown or a promise is rejected (call handleAxiosError) expect(mockedVscode.window.showWarningMessage).toHaveBeenCalledTimes(0); @@ -357,65 +353,59 @@ describe("Client", () => { expect(mockedVscode.window.showInformationMessage).toHaveBeenCalledWith("Signed up. Please log in."); }); - it("should sign up teacher", async () => { - const userCredentials: UserSignup = { + it("should generate an invitation for a new teacher", async () => { + const invitedTeacherCredentials: UserSignup = { username: "johndoe", - password: "password", email: "johndoe@john.com", name: "John", lastName: "Doe", }; const expectedAxiosConfigSignupRequest: AxiosRequestConfig = { baseURL, - url: "/api/teachers/register", + url: "/api/teachers/invitation", method: "POST", headers: { "Authorization": "Bearer " + jwtToken, "X-XSRF-TOKEN": xsrfToken, "Cookie": "XSRF-TOKEN=" + xsrfToken, }, - data: userCredentials, + data: invitedTeacherCredentials, responseType: "json", maxContentLength: Infinity, maxBodyLength: Infinity, }; - const expectedAxiosResponseSignup: AxiosResponse = { - status: 200, - statusText: "OK", - headers: { - }, + const expectedAxiosResponseSignup: AxiosResponse = { + status: 201, + statusText: "", + headers: {}, data: { - id: 23, email: "johndoe@john.com", username: "johndoe", name: "John", lastName: "Doe", - roles: [ - { - roleName: "ROLE_STUDENT", - }, - { - roleName: "ROLE_TEACHER", - }, - ], + password: "bf8a45f8-c20f-4eab-bb13-b02f78cffcb3", // Fake UUID }, config: expectedAxiosConfigSignupRequest, }; mockedAxios .mockRejectedValue("Error in test") // default .mockResolvedValueOnce(expectedAxiosResponseSignup); - await APIClient.signUpV4T(userCredentials, true); + await APIClient.signUpTeacher(invitedTeacherCredentials); + + // Response is interpreted and link is generated + const link = baseURL + "/app/teacher/sign-up/" + expectedAxiosResponseSignup.data.password; // Fail if errors are thrown or a promise is rejected (call handleAxiosError) expect(mockedVscode.window.showWarningMessage).toHaveBeenCalledTimes(0); - expect(mockedVscode.window.showErrorMessage).toHaveBeenCalledTimes(0); + // When testing, promise returned by showInformationError gets rejected (because of a undefined value), so error is caught (handleAxiosError) + expect(mockedVscode.window.showErrorMessage).toHaveBeenCalledTimes(1); // Set status bar when calling signup - expect(mockedVscode.window.setStatusBarMessage).toHaveBeenNthCalledWith(1, "$(sync~spin) Signing teacher up to VS Code 4 Teaching...", expect.anything()); + expect(mockedVscode.window.setStatusBarMessage).toHaveBeenNthCalledWith(1, "$(sync~spin) Inviting teacher to VS Code 4 Teaching...", expect.anything()); // Make a request for signing up expect(mockedAxios).toHaveBeenCalledTimes(1); expect(mockedAxios).toHaveBeenNthCalledWith(1, expectedAxiosConfigSignupRequest); // Show user that he is signed up expect(mockedVscode.window.showInformationMessage).toHaveBeenCalledTimes(1); - expect(mockedVscode.window.showInformationMessage).toHaveBeenCalledWith("Teacher signed up successfully."); + expect(mockedVscode.window.showInformationMessage).toHaveBeenCalledWith("The new teacher has been successfully invited! Copy the link and share it with they to finish the process:\n" + link, "Copy link"); }); }); diff --git a/vscode4teaching-extension/test/unitSuite/ClientAPICalls.test.ts b/vscode4teaching-extension/test/unitSuite/ClientAPICalls.test.ts index 02e25ee3..61bb8e7f 100644 --- a/vscode4teaching-extension/test/unitSuite/ClientAPICalls.test.ts +++ b/vscode4teaching-extension/test/unitSuite/ClientAPICalls.test.ts @@ -14,8 +14,7 @@ import { ExerciseEdit } from "../../src/model/serverModel/exercise/ExerciseEdit" jest.mock("axios"); const mockedAxios = mocked(axios, true); -mockedAxios.mockResolvedValue({ - data: undefined, +mockedAxios.mockResolvedValue({ status: 200, statusText: "", headers: {}, @@ -217,7 +216,7 @@ describe("client API calls", () => { const expectedOptions: AxiosRequestConfig = { baseURL: baseUrl, - data: exercise, + data: [exercise], headers: { "Authorization": "Bearer " + jwtToken, "Cookie": "XSRF-TOKEN=" + xsrfToken, @@ -227,12 +226,42 @@ describe("client API calls", () => { maxBodyLength: Infinity, method: "POST", responseType: "json", - url: "/api/courses/" + courseId + "/exercises", + url: "/api/v2/courses/" + courseId + "/exercises", }; - const thenable = APIClient.addExercise(courseId, exercise); + const thenable = APIClient.addExercises(courseId, [exercise]); - expectCorrectRequest(expectedOptions, "Adding exercise...", false, thenable); + expectCorrectRequest(expectedOptions, "Adding new exercises...", false, thenable); + }); + + it("should request add multiple exercises correctly", () => { + const courseId = 1; + const exercises: ExerciseEdit[] = [ + { name: "Exercise 1", }, + { name: "Exercise 2", }, + { name: "Exercise 3", }, + { name: "Exercise 4", }, + { name: "Exercise 5", }, + ]; + + const expectedOptions: AxiosRequestConfig = { + baseURL: baseUrl, + data: exercises, + headers: { + "Authorization": "Bearer " + jwtToken, + "Cookie": "XSRF-TOKEN=" + xsrfToken, + "X-XSRF-TOKEN": xsrfToken, + }, + maxContentLength: Infinity, + maxBodyLength: Infinity, + method: "POST", + responseType: "json", + url: "/api/v2/courses/" + courseId + "/exercises", + }; + + const thenable = APIClient.addExercises(courseId, exercises); + + expectCorrectRequest(expectedOptions, "Adding new exercises...", false, thenable); }); it("should request edit exercise correctly", () => { @@ -663,7 +692,7 @@ describe("client API calls", () => { expectCorrectRequest(expectedOptions, "Saving comments...", false, thenable); }); - it("should request get sharing code for exercise correctly", () => { + it("should join course with sharing code correctly", () => { const code = "testcode"; const expectedOptions: AxiosRequestConfig = { baseURL: baseUrl, @@ -675,7 +704,7 @@ describe("client API calls", () => { }, maxContentLength: Infinity, maxBodyLength: Infinity, - method: "GET", + method: "PUT", responseType: "json", url: "/api/courses/code/" + code, }; diff --git a/vscode4teaching-extension/test/unitSuite/Commands.test.ts b/vscode4teaching-extension/test/unitSuite/Commands.test.ts index 7032a70b..116e8252 100644 --- a/vscode4teaching-extension/test/unitSuite/Commands.test.ts +++ b/vscode4teaching-extension/test/unitSuite/Commands.test.ts @@ -190,6 +190,7 @@ describe("Command implementations", () => { name: "Test exercise", }; const eui: ExerciseUserInfo = { + id: 3, status: 1, user, exercise, @@ -408,11 +409,11 @@ describe("Command implementations", () => { }); it("should run diff", async () => { - const file = mockedVscode.Uri.file("johndoejr/file.txt"); + const file = mockedVscode.Uri.file("student_11/file.txt"); const wf: vscode.WorkspaceFolder = { index: 0, - name: "johndoejr", - uri: mockedVscode.Uri.file("johndoejr"), + name: "student_11", + uri: mockedVscode.Uri.file("student_11"), }; mockedVscode.workspace.getWorkspaceFolder.mockReturnValueOnce(wf); mockedPath.relative.mockReturnValueOnce("file.txt"); @@ -429,10 +430,10 @@ describe("Command implementations", () => { expect(mockedPath.relative).toHaveBeenCalledTimes(1); expect(mockedPath.relative).toHaveBeenNthCalledWith(1, wf.uri.fsPath, file.fsPath); expect(mockedPath.resolve).toHaveBeenCalledTimes(2); - expect(mockedPath.resolve).toHaveBeenNthCalledWith(1, "johndoejr", ".."); - expect(mockedPath.resolve).toHaveBeenNthCalledWith(2, "template", "file.txt"); + expect(mockedPath.resolve).toHaveBeenNthCalledWith(1, "student_11", ".."); + expect(mockedPath.resolve).toHaveBeenNthCalledWith(2, "parentdir", "template", "file.txt"); expect(mockedFs.existsSync).toHaveBeenCalledTimes(1); expect(mockedVscode.commands.executeCommand).toHaveBeenCalledTimes(1); - expect(mockedVscode.commands.executeCommand).toHaveBeenNthCalledWith(1, "vscode.diff", mockedVscode.Uri.file("template/file.txt"), file); + expect(mockedVscode.commands.executeCommand).toHaveBeenNthCalledWith(1, "vscode.diff", file, mockedVscode.Uri.file("template/file.txt")); }); }); diff --git a/vscode4teaching-extension/test/unitSuite/CommentService.test.ts b/vscode4teaching-extension/test/unitSuite/CommentService.test.ts index a6316a84..e361e9bb 100644 --- a/vscode4teaching-extension/test/unitSuite/CommentService.test.ts +++ b/vscode4teaching-extension/test/unitSuite/CommentService.test.ts @@ -137,7 +137,7 @@ describe("Comment Service", () => { data: Object.assign({ id: 10 }, savedCommentResponseData), status: 201, statusText: "", - headers: [], + headers: {}, config: {}, }; @@ -193,7 +193,7 @@ describe("Comment Service", () => { data, status: 200, statusText: "", - headers: [], + headers: {}, config: {}, }; mockedClient.getAllComments.mockResolvedValueOnce(commentsResponse); diff --git a/vscode4teaching-extension/test/unitSuite/DashboardWebview.test.ts b/vscode4teaching-extension/test/unitSuite/DashboardWebview.test.ts index 03d9af98..df8cb321 100644 --- a/vscode4teaching-extension/test/unitSuite/DashboardWebview.test.ts +++ b/vscode4teaching-extension/test/unitSuite/DashboardWebview.test.ts @@ -56,6 +56,7 @@ describe("Dashboard webview", () => { const euis: ExerciseUserInfo[] = []; let now = new Date(new Date().toLocaleString("en-US", { timeZone: "UTC" })); euis.push({ + id: 1, exercise, user: student1, status: 0, @@ -64,6 +65,7 @@ describe("Dashboard webview", () => { }); now = new Date(new Date().toLocaleString("en-US", { timeZone: "UTC" })); euis.push({ + id: 2, exercise, user: student2, status: 1, @@ -72,6 +74,7 @@ describe("Dashboard webview", () => { }); now = new Date(new Date().toLocaleString("en-US", { timeZone: "UTC" })); euis.push({ + id: 3, exercise, user: student3, status: 2, @@ -119,14 +122,14 @@ describe("Dashboard webview", () => { // Table headers are correct const tableHeaders = $("th").toArray(); expect(tableHeaders[0].firstChild.data?.trim()).toBe("Full name"); - expect(tableHeaders[1].firstChild.data?.trim()).toBe("Username"); + expect(tableHeaders[1].firstChild.data?.trim()).toBe("Exercise folder"); expect(tableHeaders[2].firstChild.data?.trim()).toBe("Exercise status"); expect(tableHeaders[3].firstChild.data?.trim()).toBe("Last modified file"); expect(tableHeaders[4].firstChild.data?.trim()).toBe("Last modification"); // Table data is correct const tableData = $("td").toArray(); expect(tableData[0].firstChild.data).toBe("Student 1"); - expect(tableData[1].firstChild.data).toBe("student1"); + expect(tableData[1].firstChild.data).toBe("student_1"); expect(tableData[2].firstChild.data).toBe("Not started"); expect(tableData[2].attribs.class).toBe("not-started-cell"); expect(tableData[3].childNodes[0].name).toBe("button"); @@ -135,7 +138,7 @@ describe("Dashboard webview", () => { expect(tableData[3].childNodes[1].firstChild.data).toBe("Diff"); // expect(tableData[4].firstChild.data === "1 d" || tableData[4].firstChild.data === "24 h").toBe(true); expect(tableData[5].firstChild.data).toBe("Student 2"); - expect(tableData[6].firstChild.data).toBe("student2"); + expect(tableData[6].firstChild.data).toBe("student_2"); expect(tableData[7].firstChild.data).toBe("Finished"); expect(tableData[7].attribs.class).toBe("finished-cell"); expect(tableData[8].childNodes[0].name).toBe("button"); @@ -144,7 +147,7 @@ describe("Dashboard webview", () => { expect(tableData[8].childNodes[1].firstChild.data).toBe("Diff"); // expect(tableData[9].firstChild.data).toBe("13 min"); expect(tableData[10].firstChild.data).toBe("Student 3"); - expect(tableData[11].firstChild.data).toBe("student3"); + expect(tableData[11].firstChild.data).toBe("student_3"); expect(tableData[12].firstChild.data).toBe("On progress"); expect(tableData[12].attribs.class).toBe("onprogress-cell"); // expect(tableData[14].firstChild.data).toBe("35 s"); diff --git a/vscode4teaching-extension/test/unitSuite/EntryPoint.test.ts b/vscode4teaching-extension/test/unitSuite/EntryPoint.test.ts index 943ea057..ab9ed833 100644 --- a/vscode4teaching-extension/test/unitSuite/EntryPoint.test.ts +++ b/vscode4teaching-extension/test/unitSuite/EntryPoint.test.ts @@ -71,6 +71,7 @@ describe("Extension entry point", () => { "vscode4teaching.refreshcourses", "vscode4teaching.refreshexercises", "vscode4teaching.addexercise", + "vscode4teaching.addmultipleexercises", "vscode4teaching.editexercise", "vscode4teaching.deleteexercise", "vscode4teaching.adduserstocourse", @@ -128,6 +129,7 @@ describe("Extension entry point", () => { }; mockedCurrentUser.getUserInfo.mockReturnValue(user); const eui: ExerciseUserInfo = { + id: 1, exercise, user, status: 0, diff --git a/vscode4teaching-extension/test/unitSuite/TreeView.test.ts b/vscode4teaching-extension/test/unitSuite/TreeView.test.ts index 00aec2b5..00bb109c 100644 --- a/vscode4teaching-extension/test/unitSuite/TreeView.test.ts +++ b/vscode4teaching-extension/test/unitSuite/TreeView.test.ts @@ -28,11 +28,14 @@ let coursesProvider = new CoursesProvider(); const mockedUserTeacherModel: User = { id: 1, username: "johndoe", - roles: [{ - roleName: "ROLE_STUDENT", - }, { - roleName: "ROLE_TEACHER", - }], + roles: [ + { + roleName: "ROLE_STUDENT", + }, + { + roleName: "ROLE_TEACHER", + }, + ], courses: [], }; const teacherCourses: Course[] = [ @@ -237,7 +240,7 @@ describe("Tree View", () => { }, status: 201, statusText: "", - headers: [], + headers: {}, config: {}, }); mockedCurrentUser.updateUserInfo.mockResolvedValueOnce( @@ -276,7 +279,7 @@ describe("Tree View", () => { }, status: 200, statusText: "", - headers: [], + headers: {}, config: {}, }); mockedCurrentUser.isLoggedIn.mockReturnValueOnce(true); @@ -305,7 +308,7 @@ describe("Tree View", () => { mockedClient.deleteCourse.mockResolvedValueOnce({ status: 200, statusText: "", - headers: [], + headers: {}, config: {}, data: undefined, }); @@ -359,15 +362,17 @@ describe("Tree View", () => { ]; mockedVscode.window.showOpenDialog.mockResolvedValueOnce(fileUrisMocks); - mockedClient.addExercise.mockResolvedValueOnce({ + mockedClient.addExercises.mockResolvedValueOnce({ status: 201, statusText: "", - headers: [], + headers: {}, config: {}, - data: { - id: 10, - name: exerciseModel.name, - }, + data: [ + { + id: 10, + name: exerciseModel.name, + }, + ], }); const mockBuffer = Buffer.from("test"); @@ -376,10 +381,9 @@ describe("Tree View", () => { mockedClient.uploadExerciseTemplate.mockResolvedValueOnce({ status: 200, statusText: "", - headers: [], + headers: {}, config: {}, - data: { - }, + data: {}, }); await coursesProvider.addExercise(courseModel); @@ -388,8 +392,8 @@ describe("Tree View", () => { expect(mockedVscode.window.showInputBox).toHaveBeenNthCalledWith(1, inputOptionsExercise); expect(mockedVscode.window.showOpenDialog).toHaveBeenCalledTimes(1); expect(mockedVscode.window.showOpenDialog).toHaveBeenNthCalledWith(1, openDialogOptions); - expect(mockedClient.addExercise).toHaveBeenCalledTimes(1); - expect(mockedClient.addExercise).toHaveBeenNthCalledWith(1, teacherCourses[0].id, { name: exerciseModel.name }); + expect(mockedClient.addExercises).toHaveBeenCalledTimes(1); + expect(mockedClient.addExercises).toHaveBeenNthCalledWith(1, teacherCourses[0].id, [{ name: exerciseModel.name }]); expect(mockedFileZipUtil.getZipFromUris).toHaveBeenCalledTimes(1); expect(mockedFileZipUtil.getZipFromUris).toHaveBeenNthCalledWith(1, fileUrisMocks); expect(mockedClient.uploadExerciseTemplate).toHaveBeenCalledTimes(1); @@ -418,7 +422,7 @@ describe("Tree View", () => { }, status: 200, statusText: "", - headers: [], + headers: {}, config: {}, }); @@ -444,7 +448,7 @@ describe("Tree View", () => { mockedClient.deleteExercise.mockResolvedValueOnce({ status: 200, statusText: "", - headers: [], + headers: {}, config: {}, data: undefined, }); @@ -475,9 +479,9 @@ describe("Tree View", () => { const inputOptionsName = mockGetInput("Name", Validators.validateName, userData.name); const inputOptionsLastName = mockGetInput("Last name", Validators.validateLastName, userData.lastName); - mockedClient.signUpV4T.mockResolvedValueOnce(); + mockedClient.signUpStudent.mockResolvedValueOnce(); - await coursesProvider.signup(false); + await coursesProvider.signup(); expect(mockedVscode.window.showInputBox).toHaveBeenCalledTimes(6); expect(mockedVscode.window.showInputBox).toHaveBeenNthCalledWith(1, inputOptionsUsername); @@ -486,8 +490,8 @@ describe("Tree View", () => { expect(mockedVscode.window.showInputBox).toHaveBeenNthCalledWith(4, inputOptionsEmail); expect(mockedVscode.window.showInputBox).toHaveBeenNthCalledWith(5, inputOptionsName); expect(mockedVscode.window.showInputBox).toHaveBeenNthCalledWith(6, inputOptionsLastName); - expect(mockedClient.signUpV4T).toHaveBeenCalledTimes(1); - expect(mockedClient.signUpV4T).toHaveBeenNthCalledWith(1, userData, false); + expect(mockedClient.signUpStudent).toHaveBeenCalledTimes(1); + expect(mockedClient.signUpStudent).toHaveBeenNthCalledWith(1, userData); }); it("should get course from code", async () => { @@ -502,7 +506,7 @@ describe("Tree View", () => { data: course, status: 200, statusText: "", - headers: [], + headers: {}, config: {}, }; mockedClient.getCourseWithCode.mockResolvedValueOnce(response); @@ -546,14 +550,14 @@ describe("Tree View", () => { ], status: 200, statusText: "", - headers: [], + headers: {}, config: {}, }; const responseUsersCourse: AxiosResponse = { data: [mockedUserTeacherModel, mockedUserStudentModel], status: 200, statusText: "", - headers: [], + headers: {}, config: {}, }; mockedClient.getAllUsers.mockResolvedValueOnce(responseUsers); @@ -603,7 +607,7 @@ describe("Tree View", () => { }], status: 200, statusText: "", - headers: [], + headers: {}, config: {}, }; mockedClient.getUsersInCourse.mockResolvedValueOnce(responseUsersCourse); @@ -611,7 +615,7 @@ describe("Tree View", () => { data: mockedUserTeacherModel, status: 200, statusText: "2", - headers: [], + headers: {}, config: {}, }; mockedClient.getCreator.mockResolvedValueOnce(responseCreator); diff --git a/vscode4teaching-server/API.json b/vscode4teaching-server/API.json new file mode 100644 index 00000000..edd2c3b4 --- /dev/null +++ b/vscode4teaching-server/API.json @@ -0,0 +1,2678 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "VSCode4Teaching", + "description": "VSCode4Teaching REST API Documentation", + "contact": { + "name": "VSCode4Teaching", + "url": "https://github.com/codeurjc-students/2019-VSCode4Teaching" + }, + "license": { + "name": "Apache-2.0 LICENSE", + "url": "https://github.com/codeurjc-students/2019-VSCode4Teaching/blob/master/LICENSE" + }, + "version": "2.0.2" + }, + "tags": [ + { + "name": "comment-controller", + "description": "Comment Controller" + }, + { + "name": "course-controller", + "description": "Course Controller" + }, + { + "name": "exercise-controller", + "description": "Exercise Controller" + }, + { + "name": "exercise-files-controller", + "description": "Exercise Files Controller" + }, + { + "name": "jwt-login-controller", + "description": "JWT Login Controller" + }, + { + "name": "view-controller", + "description": "View Controller" + } + ], + "paths": { + "/api/comments/{commentThreadId}/lines": { + "put": { + "tags": [ + "comment-controller" + ], + "summary": "updateCommentThreadLine", + "operationId": "updateCommentThreadLineUsingPUT", + "parameters": [ + { + "name": "commentThreadId", + "in": "path", + "description": "commentThreadId", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommentThreadDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CommentThreadGeneralViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/files/{fileId}/comments": { + "get": { + "tags": [ + "comment-controller" + ], + "summary": "getCommentThreads", + "operationId": "getCommentThreadsUsingGET", + "parameters": [ + { + "name": "fileId", + "in": "path", + "description": "fileId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CommentThreadCommentViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "comment-controller" + ], + "summary": "saveCommentThread", + "operationId": "saveCommentThreadUsingPOST", + "parameters": [ + { + "name": "fileId", + "in": "path", + "description": "fileId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CommentThreadDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CommentThreadCommentViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/users/{username}/exercises/{exerciseId}/comments": { + "get": { + "tags": [ + "comment-controller" + ], + "summary": "getCommentsByUser", + "operationId": "getCommentsByUserUsingGET", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "username", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + { + "name": "exerciseId", + "in": "path", + "description": "exerciseId", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExerciseFileCommentViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/courses": { + "get": { + "tags": [ + "course-controller" + ], + "summary": "getAllCourses", + "operationId": "getAllCoursesUsingGET", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CourseCreatorViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "course-controller" + ], + "summary": "addCourse", + "operationId": "addCourseUsingPOST", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CourseDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CourseCreatorViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/courses/code/{courseCode}": { + "get": { + "tags": [ + "course-controller" + ], + "summary": "getExercisesWithCode", + "operationId": "getExercisesWithCodeUsingGET", + "parameters": [ + { + "name": "courseCode", + "in": "path", + "description": "courseCode", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CourseExercisesViewView" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "deprecated": true + }, + "put": { + "tags": [ + "course-controller" + ], + "summary": "joinCourse", + "operationId": "joinCourseUsingPUT", + "parameters": [ + { + "name": "courseCode", + "in": "path", + "description": "courseCode", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CourseExercisesViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/courses/{courseId}": { + "get": { + "tags": [ + "course-controller" + ], + "summary": "getCourse", + "operationId": "getCourseUsingGET", + "parameters": [ + { + "name": "courseId", + "in": "path", + "description": "courseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CourseCreatorViewView" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/courses/{courseId}/code": { + "get": { + "tags": [ + "course-controller" + ], + "summary": "getCode", + "operationId": "getCodeUsingGET", + "parameters": [ + { + "name": "courseId", + "in": "path", + "description": "courseId", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/courses/{courseId}/creator": { + "get": { + "tags": [ + "course-controller" + ], + "summary": "getCreator", + "operationId": "getCreatorUsingGET", + "parameters": [ + { + "name": "courseId", + "in": "path", + "description": "courseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/UserGeneralViewView" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/courses/{courseId}/users": { + "get": { + "tags": [ + "course-controller" + ], + "summary": "getUsersInCourse", + "operationId": "getUsersInCourseUsingGET", + "parameters": [ + { + "name": "courseId", + "in": "path", + "description": "courseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "uniqueItems": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/UserGeneralViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "course-controller" + ], + "summary": "addUserToCourse", + "operationId": "addUserToCourseUsingPOST", + "parameters": [ + { + "name": "courseId", + "in": "path", + "description": "courseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CourseUsersViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "delete": { + "tags": [ + "course-controller" + ], + "summary": "removeUsersFromCourse", + "operationId": "removeUsersFromCourseUsingDELETE", + "parameters": [ + { + "name": "courseId", + "in": "path", + "description": "courseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CourseUsersViewView" + } + } + } + }, + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/api/courses/{id}": { + "put": { + "tags": [ + "course-controller" + ], + "summary": "updateCourse", + "operationId": "updateCourseUsingPUT", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CourseDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CourseCreatorViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "delete": { + "tags": [ + "course-controller" + ], + "summary": "deleteCourse", + "operationId": "deleteCourseUsingDELETE", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/api/users/{id}/courses": { + "get": { + "tags": [ + "course-controller" + ], + "summary": "getUserCourses", + "operationId": "getUserCoursesUsingGET", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CourseCreatorViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/v2/courses/code/{courseCode}": { + "get": { + "tags": [ + "course-controller" + ], + "summary": "getCourseInformationBySharingCode", + "operationId": "getCourseInformationBySharingCodeUsingGET", + "parameters": [ + { + "name": "courseCode", + "in": "path", + "description": "courseCode", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CourseCreatorViewView" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/courses/{courseId}/exercises": { + "get": { + "tags": [ + "exercise-controller" + ], + "summary": "getExercises", + "operationId": "getExercisesUsingGET", + "parameters": [ + { + "name": "courseId", + "in": "path", + "description": "courseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExerciseCourseViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "exercise-controller" + ], + "summary": "addExercise", + "operationId": "addExerciseUsingPOST", + "parameters": [ + { + "name": "courseId", + "in": "path", + "description": "courseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExerciseDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ExerciseCourseViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/exercises/{exerciseId}": { + "put": { + "tags": [ + "exercise-controller" + ], + "summary": "updateExercise", + "operationId": "updateExerciseUsingPUT", + "parameters": [ + { + "name": "exerciseId", + "in": "path", + "description": "exerciseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExerciseDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ExerciseCourseViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "delete": { + "tags": [ + "exercise-controller" + ], + "summary": "deleteExercise", + "operationId": "deleteExerciseUsingDELETE", + "parameters": [ + { + "name": "exerciseId", + "in": "path", + "description": "exerciseId", + "required": true, + "style": "simple", + "schema": { + "minimum": 1, + "exclusiveMinimum": false, + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/api/exercises/{exerciseId}/code": { + "get": { + "tags": [ + "exercise-controller" + ], + "summary": "getCode", + "operationId": "getCodeUsingGET_1", + "parameters": [ + { + "name": "exerciseId", + "in": "path", + "description": "exerciseId", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/exercises/{exerciseId}/info": { + "get": { + "tags": [ + "exercise-controller" + ], + "summary": "getExerciseUserInfo", + "operationId": "getExerciseUserInfoUsingGET", + "parameters": [ + { + "name": "exerciseId", + "in": "path", + "description": "exerciseId", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ExerciseUserInfoGeneralViewView" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "put": { + "tags": [ + "exercise-controller" + ], + "summary": "updateExerciseUserInfo", + "operationId": "updateExerciseUserInfoUsingPUT", + "parameters": [ + { + "name": "exerciseId", + "in": "path", + "description": "exerciseId", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExerciseUserInfoDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ExerciseUserInfoGeneralViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/exercises/{exerciseId}/info/teacher": { + "get": { + "tags": [ + "exercise-controller" + ], + "summary": "getAllExerciseUserInfo", + "operationId": "getAllExerciseUserInfoUsingGET", + "parameters": [ + { + "name": "exerciseId", + "in": "path", + "description": "exerciseId", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExerciseUserInfoGeneralViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/exercises/{id}/files": { + "get": { + "tags": [ + "exercise-files-controller" + ], + "summary": "downloadExerciseFiles", + "operationId": "downloadExerciseFilesUsingGET", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "exercise-files-controller" + ], + "summary": "uploadZip", + "operationId": "uploadZipUsingPOST", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UploadFileResponse" + } + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/exercises/{id}/files/template": { + "get": { + "tags": [ + "exercise-files-controller" + ], + "summary": "getTemplate", + "operationId": "getTemplateUsingGET", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "exercise-files-controller" + ], + "summary": "uploadTemplate", + "operationId": "uploadTemplateUsingPOST", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UploadFileResponse" + } + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/exercises/{id}/teachers/files": { + "get": { + "tags": [ + "exercise-files-controller" + ], + "summary": "getAllStudentsFiles", + "operationId": "getAllStudentsFilesUsingGET", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/users/{username}/exercises/{exerciseId}/files": { + "get": { + "tags": [ + "exercise-files-controller" + ], + "summary": "getFileInfoByOwnerAndExercise", + "operationId": "getFileInfoByOwnerAndExerciseUsingGET", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "username", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + { + "name": "exerciseId", + "in": "path", + "description": "exerciseId", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExerciseFileGeneralViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/csrf": { + "get": { + "tags": [ + "jwt-login-controller" + ], + "summary": "getCsrfToken", + "operationId": "getCsrfTokenUsingGET", + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/currentuser": { + "get": { + "tags": [ + "jwt-login-controller" + ], + "summary": "getCurrentUser", + "operationId": "getCurrentUserUsingGET", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/UserCourseViewView" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/login": { + "post": { + "tags": [ + "jwt-login-controller" + ], + "summary": "generateLoginToken", + "operationId": "generateLoginTokenUsingPOST", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JWTRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/JWTResponse" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/register": { + "post": { + "tags": [ + "jwt-login-controller" + ], + "summary": "saveUser", + "operationId": "saveUserUsingPOST", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/UserEmailViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/teachers/invitation": { + "post": { + "tags": [ + "jwt-login-controller" + ], + "summary": "saveTeacherInvitation", + "operationId": "saveTeacherInvitationUsingPOST", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/UserDTO" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/teachers/register": { + "post": { + "tags": [ + "jwt-login-controller" + ], + "summary": "saveTeacher", + "operationId": "saveTeacherUsingPOST", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDTO" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/UserEmailViewView" + } + } + } + }, + "201": { + "description": "Created" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "deprecated": true + } + }, + "/api/users": { + "get": { + "tags": [ + "jwt-login-controller" + ], + "summary": "getAllUsers", + "operationId": "getAllUsersUsingGET", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserGeneralViewView" + } + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/api/users/{id}/password": { + "patch": { + "tags": [ + "jwt-login-controller" + ], + "summary": "changePassword", + "operationId": "changePasswordUsingPATCH", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "id", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/UserGeneralViewView" + } + } + } + }, + "204": { + "description": "No Content" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/": { + "get": { + "tags": [ + "view-controller" + ], + "summary": "redirect", + "operationId": "redirectUsingGET", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/app/**/{path}": { + "get": { + "tags": [ + "view-controller" + ], + "summary": "serveAngularWebapp", + "operationId": "serveAngularWebappUsingGET", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/{path}": { + "get": { + "tags": [ + "view-controller" + ], + "summary": "serveAngularWebapp", + "operationId": "serveAngularWebappUsingGET_1", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + } + }, + "components": { + "schemas": { + "CommentCommentViewView": { + "title": "CommentCommentViewView", + "type": "object", + "properties": { + "author": { + "type": "string" + }, + "body": { + "type": "string" + }, + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "CommentDTO": { + "title": "CommentDTO", + "type": "object", + "properties": { + "author": { + "type": "string" + }, + "body": { + "type": "string" + } + } + }, + "CommentThreadCommentViewView": { + "title": "CommentThreadCommentViewView", + "type": "object", + "properties": { + "comments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CommentCommentViewView" + } + }, + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "line": { + "type": "integer", + "format": "int64" + }, + "lineText": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "CommentThreadDTO": { + "title": "CommentThreadDTO", + "type": "object", + "properties": { + "comments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CommentDTO" + } + }, + "line": { + "type": "integer", + "format": "int64" + }, + "lineText": { + "type": "string" + } + } + }, + "CommentThreadGeneralViewView": { + "title": "CommentThreadGeneralViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "line": { + "type": "integer", + "format": "int64" + }, + "lineText": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "CourseCourseViewView": { + "title": "CourseCourseViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "CourseCreatorViewView": { + "title": "CourseCreatorViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "creator": { + "$ref": "#/components/schemas/UserCreatorViewView" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "CourseDTO": { + "title": "CourseDTO", + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "CourseExercisesViewView": { + "title": "CourseExercisesViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "exercises": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExerciseExercisesViewView" + } + }, + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "CourseGeneralViewView": { + "title": "CourseGeneralViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "creator": { + "$ref": "#/components/schemas/UserGeneralViewView" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "CourseUsersViewView": { + "title": "CourseUsersViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + }, + "usersInCourse": { + "uniqueItems": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/UserUsersViewView" + } + } + } + }, + "ExerciseCourseViewView": { + "title": "ExerciseCourseViewView", + "type": "object", + "properties": { + "course": { + "$ref": "#/components/schemas/CourseCourseViewView" + }, + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "ExerciseDTO": { + "title": "ExerciseDTO", + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "ExerciseExercisesViewView": { + "title": "ExerciseExercisesViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "ExerciseFileCommentViewView": { + "title": "ExerciseFileCommentViewView", + "type": "object", + "properties": { + "comments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CommentThreadCommentViewView" + } + }, + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "path": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "ExerciseFileGeneralViewView": { + "title": "ExerciseFileGeneralViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "path": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "ExerciseGeneralViewView": { + "title": "ExerciseGeneralViewView", + "type": "object", + "properties": { + "course": { + "$ref": "#/components/schemas/CourseGeneralViewView" + }, + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + } + } + }, + "ExerciseUserInfoDTO": { + "title": "ExerciseUserInfoDTO", + "type": "object", + "properties": { + "modifiedFiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "status": { + "type": "integer", + "format": "int32" + } + } + }, + "ExerciseUserInfoGeneralViewView": { + "title": "ExerciseUserInfoGeneralViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "exercise": { + "$ref": "#/components/schemas/ExerciseGeneralViewView" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "modifiedFiles": { + "uniqueItems": true, + "type": "array", + "items": { + "type": "string" + } + }, + "status": { + "type": "integer", + "format": "int32" + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + }, + "user": { + "$ref": "#/components/schemas/UserGeneralViewView" + } + } + }, + "JWTRequest": { + "title": "JWTRequest", + "type": "object", + "properties": { + "password": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "JWTResponse": { + "title": "JWTResponse", + "type": "object", + "properties": { + "jwtToken": { + "type": "string" + } + } + }, + "RoleCourseViewView": { + "title": "RoleCourseViewView", + "type": "object", + "properties": { + "roleName": { + "type": "string" + } + } + }, + "RoleCreatorViewView": { + "title": "RoleCreatorViewView", + "type": "object", + "properties": { + "roleName": { + "type": "string" + } + } + }, + "RoleEmailViewView": { + "title": "RoleEmailViewView", + "type": "object", + "properties": { + "roleName": { + "type": "string" + } + } + }, + "RoleGeneralViewView": { + "title": "RoleGeneralViewView", + "type": "object", + "properties": { + "roleName": { + "type": "string" + } + } + }, + "RoleUsersViewView": { + "title": "RoleUsersViewView", + "type": "object", + "properties": { + "roleName": { + "type": "string" + } + } + }, + "UploadFileResponse": { + "title": "UploadFileResponse", + "type": "object", + "properties": { + "fileName": { + "type": "string" + }, + "fileType": { + "type": "string" + }, + "size": { + "type": "integer", + "format": "int64" + } + } + }, + "UserCourseViewView": { + "title": "UserCourseViewView", + "type": "object", + "properties": { + "courses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CourseCourseViewView" + } + }, + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "lastName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RoleCourseViewView" + } + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + }, + "username": { + "pattern": "^(?:(?!template).)+$", + "type": "string" + } + } + }, + "UserCreatorViewView": { + "title": "UserCreatorViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "lastName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RoleCreatorViewView" + } + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + }, + "username": { + "pattern": "^(?:(?!template).)+$", + "type": "string" + } + } + }, + "UserDTO": { + "title": "UserDTO", + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "username": { + "pattern": "^(?:(?!template).)+$", + "type": "string" + } + } + }, + "UserEmailViewView": { + "title": "UserEmailViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "email": { + "type": "string" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "lastName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RoleEmailViewView" + } + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + }, + "username": { + "pattern": "^(?:(?!template).)+$", + "type": "string" + } + } + }, + "UserGeneralViewView": { + "title": "UserGeneralViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "lastName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RoleGeneralViewView" + } + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + }, + "username": { + "pattern": "^(?:(?!template).)+$", + "type": "string" + } + } + }, + "UserRequest": { + "title": "UserRequest", + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + } + } + }, + "UserUsersViewView": { + "title": "UserUsersViewView", + "type": "object", + "properties": { + "createDateTime": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "lastName": { + "type": "string" + }, + "name": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RoleUsersViewView" + } + }, + "updateDateTime": { + "type": "string", + "format": "date-time" + }, + "username": { + "pattern": "^(?:(?!template).)+$", + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/vscode4teaching-server/API.md b/vscode4teaching-server/API.md deleted file mode 100644 index 8de4cd53..00000000 --- a/vscode4teaching-server/API.md +++ /dev/null @@ -1,2376 +0,0 @@ -# REST API Documentation - -Document explaining how the REST API for the server is used. -Note: All requests can respond with code 401 if the required role isn't fulfilled. -This REST server uses JWT for authentication, and CSRF Cookie for CSRF security. -Every non GET request needs a header with the CSRF Token that comes with the cookie. -Cookie key: `XSRF-TOKEN` -Needed header key: `X-XSRF-TOKEN` - -## Table of Contents - -- [User management](API.md#user-management) - - [Login](API.md#login) - - [Get CSRF Token](API.md#get-csrf-token) - - [Register a new student](API.md#register-a-new-student) - - [Register a new teacher](API.md#register-a-new-teacher) - - [Get all users](API.md#get-all-users) - - [Get current user info](API.md#get-current-user-info) -- [Courses](API.md#courses) - - [Get all courses](API.md#get-all-courses) - - [Get course creator](API.md#get-course-creator) - - [Get users in course](API.md#get-users-in-course) - - [Get user courses](API.md#get-user-courses) - - [Add a course](API.md#add-a-course) - - [Edit a course](API.md#edit-a-course) - - [Delete a course](API.md#delete-a-course) - - [Add user to course](API.md#add-user-to-course) - - [Remove user from course](API.md#remove-user-from-course) -- [Exercises](API.md#exercises) - - [Get exercises of a course](API.md#get-exercises-of-a-course) - - [Add an exercise to a course](API.md#add-an-exercise-to-a-course) - - [Edit an exercise](API.md#edit-an-exercise) - - [Delete an exercise](API.md#delete-an-exercise) - - [Download exercise files](API.md#download-exercise-files) - - [Download exercise template](API.md#download-exercise-template) - - [Upload user files](API.md#upload-user-files) - - [Upload exercise template](API.md#upload-exercise-template) - - [Get file info by exercise and owner](API.md#get-file-info-by-exercise-and-owner) - - [Get exercise user info for current user](API.md#get-exercise-user-info-for-current-user) - - [Update exercise user info for current user](API.md#update-exercise-user-info-for-current-user) - - [Get all students' exercise info](API.md#get-all-students-exercise-info) -- [Comments](API.md#comments) - - [Add comment thread](API.md#add-comment-thread) - - [Get comment threads](API.md#get-comment-threads) - - [Get comments by exercise and username](API.md#get-comments-by-exercise-and-username) -- [Code sharing](API.md#code-sharing) - - [Get course unique code](API.md#get-course-unique-code) - - [Get exercise unique code](API.md#get-exercise-unique-code) - - [Get course and its exercises with sharing code](API.md#get-course-and-its-exercises-with-sharing-code) - -## User management - -### Login - ---- - -Log in on the server and receive the JWT Token. The token should be in an Authorization header like: -`Authorization: Bearer [token]` -where `token` is the token received in this request. - -- **Required role**: - None -- **URL** - `/api/login` -- **Method** - `POST` -- **Data Params** - - **Required**: - `"username": [string]` - `"password": [string]` - - **Example**: - - ```json - { - "username": "johndoe", - "password": "johnpassword" - } - ``` - -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "jwtToken": "token" - } - ``` - -### Get CSRF Token - ---- - -Empty method aimed to help getting the CSRF Cookie without getting any data. Note that you can get this CSRF Token from any request. - -- **Required role**: - None -- **URL** - `/api/csrf` -- **Method** - `GET` -- **Success Response** - - **Code**: 200 - - **Content**: Empty - -### Register a new student - ---- - -Register a new user as a student. - -- **Required role**: - None -- **URL** - `/api/register` -- **Method** - `POST` -- **Data Params** - - **Required**: - `"email": [string]` - valid email, unique - `"username": [string]` - Between 4 and 50 characters, unique - `"password": [string]` - Longer than 8 characters - `"name": [string]` - `"lastName": [string]` - - **Example**: - - ```json - { - "email": "johndoe@john.com", - "username": "johndoe", - "password": "johnpassword", - "name": "John", - "lastName": "Doe" - } - ``` - -- **Success Response** - - **Code**: 201 - - **Content**: - - ```json - { - "id": 23, - "email": "johndoe@john.com", - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ] - } - ``` - -- **Error response** - - **Code**: 400 - - **Content** - - ```json - { - "errors": [ - { - "fieldName": "lastName", - "message": "Please provide your last name" - }, - { - "fieldName": "email", - "message": "Please provide an email" - }, - { - "fieldName": "name", - "message": "Please provide your name" - } - ] - } - - ``` - - OR - - **Code**: 400 - - **Content** - - ```text - Duplicate entry 'johndoe'. - ``` - -### Register a new teacher - ---- - -Register a new user as a teacher. - -- **Required role**: - Teacher -- **URL** - `/api/teachers/register` -- **Method** - `POST` -- **Data Params** - - **Required**: - `"email": [string]` - valid email, unique - `"username": [string]` - Between 4 and 50 characters, unique - `"password": [string]` - Longer than 8 characters - `"name": [string]` - `"lastName": [string]` - - **Example**: - - ```json - { - "email": "johndoe@john.com", - "username": "johndoe", - "password": "johnpassword", - "name": "John", - "lastName": "Doe" - } - ``` - -- **Success Response** - - **Code**: 201 - - **Content**: - - ```json - { - "id": 23, - "email": "johndoe@john.com", - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ] - } - ``` - -- **Error response** - - **Code**: 400 - - **Content** - - ```json - { - "errors": [ - { - "fieldName": "lastName", - "message": "Please provide your last name" - }, - { - "fieldName": "email", - "message": "Please provide an email" - }, - { - "fieldName": "name", - "message": "Please provide your name" - } - ] - } - ``` - - OR - - **Code**: 400 - - **Content** - - ```text - Duplicate entry 'johndoe'. - ``` - -### Get all users - ---- - -Get all available users. - -- **Required role**: - Teacher -- **URL** - `/api/users` -- **Method** - `GET` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-11T13:17:43", - "updateDateTime": "2019-11-11T13:17:43" - }, - { - "id": 4, - "username": "johndoejr", - "name": "John", - "lastName": "Doe Jr 1", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2019-11-11T13:17:43", - "updateDateTime": "2019-11-11T13:17:43" - }, - { - "id": 5, - "username": "johndoejr2", - "name": "John", - "lastName": "Doe Jr 2", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2019-11-11T13:17:43", - "updateDateTime": "2019-11-11T13:17:43" - }, - { - "id": 6, - "username": "johndoejr3", - "name": "John", - "lastName": "Doe Jr 3", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2019-11-11T13:17:43", - "updateDateTime": "2019-11-11T13:17:43" - } - ] - ``` - -### Get current user info - ---- - -Get currently logged in user information and his courses. - -- **Required role**: - Student/Teacher -- **URL** - `/api/currentuser` -- **Method** - `GET` -- **Success Response (Courses Found)** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "courses": [ - { - "id": 7, - "name": "Spring Boot Course", - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - { - "id": 8, - "name": "Angular Course", - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - { - "id": 9, - "name": "VSCode Extension API Course", - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - } - ``` - -## Courses - -### Get all courses - ---- - -Get all available courses. - -- **Required role**: - Student -- **URL** - `/api/courses` -- **Method** - `GET` -- **Success Response (Courses Found)** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:37:05", - "updateDateTime": "2019-11-14T11:37:05" - }, - "createDateTime": "2019-11-14T11:37:05", - "updateDateTime": "2019-11-14T11:37:05" - }, - { - "id": 8, - "name": "Angular Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:37:05", - "updateDateTime": "2019-11-14T11:37:05" - }, - "createDateTime": "2019-11-14T11:37:05", - "updateDateTime": "2019-11-14T11:37:05" - }, - { - "id": 9, - "name": "VSCode Extension API Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:37:05", - "updateDateTime": "2019-11-14T11:37:05" - }, - "createDateTime": "2019-11-14T11:37:05", - "updateDateTime": "2019-11-14T11:37:05" - } - ] - ``` - -- **Success Response (No courses found)** - - **Code**: 204 - - **Content**: Empty - -### Get course creator - ---- - -Get the creator of a course. - -- **Required role**: - None -- **URL** - `/api/courses/:courseId/creator` - **Example**: - `/api/courses/7/creator` -- **Method** - `GET` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - } - ``` - -### Get users in course - ---- - -Get all users in a course. - -- **Required role**: - Student or Teacher -- **URL** - `/api/courses/:courseId/users` -- **URL Params** - - **Required** - - `courseId=[long]` - - **Example** - `/api/users/1/courses` -- **Method** - `GET` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-11T13:17:43", - "updateDateTime": "2019-11-11T13:17:43" - }, - { - "id": 4, - "username": "johndoejr", - "name": "John", - "lastName": "Doe Jr 1", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2019-11-11T13:17:43", - "updateDateTime": "2019-11-11T13:17:43" - }, - { - "id": 5, - "username": "johndoejr2", - "name": "John", - "lastName": "Doe Jr 2", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2019-11-11T13:17:43", - "updateDateTime": "2019-11-11T13:17:43" - }, - { - "id": 6, - "username": "johndoejr3", - "name": "John", - "lastName": "Doe Jr 3", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2019-11-11T13:17:43", - "updateDateTime": "2019-11-11T13:17:43" - } - ] - ``` - -### Get user courses - ---- - -Get courses available to the user. User indicated has to be the same as the user logged. - -- **Required role**: - Student or Teacher -- **URL** - `/api/users/:id/courses` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - `/api/users/1/courses` -- **Success Response (Courses Found)** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - { - "id": 8, - "name": "Angular Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - { - "id": 9, - "name": "VSCode Extension API Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - } - ] - ``` - -- **Success Response (No courses found)** - - **Code**: 204 - - **Content**: Empty - -### Add a course - ---- - -Add a course to the system. Saves the course in the name of the current logged in teacher. - -- **Required role**: - Teacher -- **URL** - `/api/courses` -- **Method** - `POST` -- **Data Params** - - **Required**: - `"name": [string]` - Between 10 and 100 characters - - **Example**: - - ```json - { - "name": "Spring Boot Course" - } - ``` - -- **Success Response** - - **Code**: 201 - - **Content**: - - ```json - { - "id": 343, - "name": "New course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:47:58.929", - "updateDateTime": "2019-11-14T11:47:58.929" - } - ``` - -- **Error Response** - - **Code**: 400 - - **Content**: - - ```json - { - "errors": [ - { - "errors": [ - { - "fieldName": "name", - "message": "Course name should be between 10 and 100 characters" - }, - { - "fieldName": "name", - "message": "Name cannot be null" - } - ] - } - ] - } - ``` - -### Edit a course - ---- - -Edit course fields. Currently you can edit with this method: name. - -- **Required role**: - Teacher -- **URL** - `/api/courses/:courseId` -- **Method** - `PUT` -- **URL Params** - - **Required**: - `courseId=[long]` - - **Example**: - `/api/courses/1` -- **Data Params** - - **Required**: - `"name": [string]` - Between 10 and 100 characters - - **Example**: - - ```json - { - "name": "Spring Boot Course v2" - } - ``` - -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 343, - "name": "Edited course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:47:58", - "updateDateTime": "2019-11-14T11:49:12.301" - } - ``` - -- **Error Response** - - **Code**: 400 - - **Content**: - - ```json - { - "errors": [ - { - "fieldName": "name", - "message": "Name cannot be empty" - }, - { - "fieldName": "name", - "message": "Course name should be between 10 and 100 characters" - } - ] - } - ``` - - OR - - **Code**: 404 - - **Content**: - - ```text - Not found: Course not found: 15. - ``` - -### Delete a course - ---- - -Remove a course. Logged user has to be the creator of this course. - -- **Required role**: - Teacher -- **URL** - `/api/courses/:id` -- **Method** - `DELETE` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/courses/7` -- **Success Response** - - **Code**: 204 -- **Error Response** - - - **Code**: 404 - - **Content**: - - ```text - Not found: Course not found: 15 - ``` - -### Add user to course - ---- - -Add a user to a course. - -- **Required role**: - Teacher -- **URL** - `/api/courses/:courseId/users` -- **Method** - `POST` -- **URL Params** - - **Required**: - `courseId=[long]` - - **Example**: - `/api/courses/1/users` -- **Data Params** - - **Required**: - `"id": [[long]]` - User ids to add to course - - **Example**: - - ```json - { - "ids": [4] - } - ``` - -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 341, - "name": "new course", - "usersInCourse": [ - { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-11T14:37:57", - "updateDateTime": "2019-11-11T14:37:57" - }, - { - "id": 4, - "username": "johndoejr", - "name": "John", - "lastName": "Doe Jr 1", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2019-11-11T14:37:57", - "updateDateTime": "2019-11-11T14:37:57" - } - ], - "createDateTime": "2019-11-11T14:40:06", - "updateDateTime": "2019-11-11T14:40:06" - } - ``` - - - **Code**: 404 - - **Content**: - - ```text - Not found: Course not found: 15. - ``` - - OR - - - **Code**: 404 - - **Content**: - - ```text - Not found: User not found: 3 - ``` - - OR - - - **Code**: 401 - - **Content**: - - ```text - User is not in course or teacher is not in this course. - ``` - -### Remove user from course - ---- - -Add a user to a course. Can't remove creator of this course. - -- **Required role**: - Teacher -- **URL** - `/api/courses/:courseId/users` -- **Method** - `DELETE` -- **URL Params** - - **Required**: - `courseId=[long]` - - **Example**: - `/api/courses/1/users` -- **Data Params** - - **Required**: - `"ids": [[long]]` - User ids to remove from course - - **Example**: - - ```json - { - "ids": [4, 5] - } - ``` - -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 341, - "name": "new course", - "usersInCourse": [ - { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-11T14:37:57", - "updateDateTime": "2019-11-11T14:37:57" - } - ], - "createDateTime": "2019-11-11T14:40:06", - "updateDateTime": "2019-11-11T14:40:06" - } - ``` - - - **Code**: 404 - - **Content**: - - ```text - Not found: Course not found: 15. - ``` - - OR - - - **Code**: 404 - - **Content**: - - ```text - Not found: User not found: 3 - ``` - - OR - - - **Code**: 401 - - **Content**: - - ```text - User is not in course or teacher is not in this course. - ``` - -## Exercises - -### Get exercises of a course - ---- - -Get all exercise of a course. Logged user has to be a member of this course. - -- **Required role**: - Student, Teacher -- **URL** - `/api/courses/:id/exercises` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/courses/7/exercises` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 10, - "name": "Exercise 1", - "course": { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - { - "id": 11, - "name": "Exercise 2", - "course": { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - { - "id": 12, - "name": "Exercise 3", - "course": { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - { - "id": 13, - "name": "Exercise 4", - "course": { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - { - "id": 14, - "name": "Exercise 5", - "course": { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - } - ] - ``` - -- **Success Response (No courses found)** - - **Code**: 204 - - **Content**: Empty -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Course not found: 15 - ``` - -### Add an exercise to a course - ---- - -Adds a new exercise to an existing course. - -- **Required role**: - Teacher -- **URL** - `/api/courses/:id/exercises` -- **Method** - `POST` -- **URL Params** - - **Required**: - - `id=[long]` - - **Example**: - `/api/courses/1/exercises` -- **Data Params** - - **Required**: - `"name": [string]` - Between 10 and 100 characters - - **Example**: - - ```json - { - "name": "Spring Boot Exercise 1" - } - ``` - -- **Success Response** - - **Code**: 201 - - **Content**: - - ```json - { - "id": 344, - "name": "New exercise", - "course": { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:55:15.553", - "updateDateTime": "2019-11-14T11:55:15.553" - } - ``` - -- **Error Response** - - **Code**: 400 - - **Content**: - - ```json - { - "errors": [ - { - "fieldName": "name", - "message": "Name cannot be empty" - }, - { - "fieldName": "name", - "message": "Exercise name should be between 10 and 100 characters" - } - ] - } - ``` - - OR - - - **Code**: 404 - - **Content**: - - ```text - Not found: Course not found. - ``` - -### Edit an exercise - ---- - -Edits an exercise fields. - -- **Required role**: - Teacher -- **URL** - `/api/exercises/:exerciseId` -- **Method** - `PUT` -- **URL Params** - - **Required**: - `exerciseId=[long]` - - **Example**: - `/api/exercises/344` -- **Data Params** - - **Required**: - `"name": [string]` - Between 10 and 100 characters - - **Example**: - - ```json - { - "name": "Edited exercise" - } - ``` - -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 344, - "name": "Edited exercise", - "course": { - "id": 7, - "name": "Spring Boot Course", - "creator": { - "id": 3, - "username": "johndoe", - "name": "John", - "lastName": "Doe", - "roles": [ - { - "roleName": "ROLE_STUDENT" - }, - { - "roleName": "ROLE_TEACHER" - } - ], - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:46:11", - "updateDateTime": "2019-11-14T11:46:11" - }, - "createDateTime": "2019-11-14T11:55:15", - "updateDateTime": "2019-11-14T11:56:41.523" - } - ``` - -- **Error Response** - - **Code**: 400 - - **Content**: - - ```json - { - "errors": [ - { - "fieldName": "name", - "message": "Name cannot be empty" - }, - { - "fieldName": "name", - "message": "Exercise name should be between 10 and 100 characters" - } - ] - } - ``` - - OR - - **Code**: 404 - - **Content**: - - ```text - Not found: Course not found: 15. - ``` - -### Delete an exercise - ---- - -Remove a course. Logged user has to be a teacher of this course. - -- **Required role**: - Teacher -- **URL** - `/api/exercises/:id` -- **Method** - `DELETE` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/7` -- **Success Response** - - **Code**: 204 -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise not found: 15 - ``` - -### Download exercise files - ---- - -Note: Content-Type is application/zip -Download the files assigned to an exercise in a zip file. -The files downloaded will be the template of the exercise if the current logged user doesn't have saved files, and his/her files if he/she does. -Name of the file if template was downloaded: `template-{id}.zip` where {id} is the id of the exercise. -Name of the file if user files were downloaded: `exercise-{id}-{username}.zip` where {id} is the id of the exercise and {username} is the username of the logged user. - -- **Required role**: - Student or Teacher -- **URL** - `/api/exercises/:id/files` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/11/files` -- **Success Response** - - **Code**: 200 -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise not found: 11 - ``` - - OR - - **Code**: 404 - - **Content** : - - ```text - No template found for exercise: 11 - ``` - -### Download exercise template - ---- - -Note: Content-Type is application/zip -Download the files assigned to an exercise template in a zip file. -Name of the file if template was downloaded: `template-{id}.zip` where {id} is the id of the exercise. - -- **Required role**: - Student or Teacher -- **URL** - `/api/exercises/:id/files/template` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/11/files/template` -- **Success Response** - - **Code**: 200 -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise not found: 11 - ``` - - OR - - **Code**: 404 - - **Content** : - - ```text - No template found for exercise: 11 - ``` - -### Upload user files - -Upload a ZIP file to the user files of an exercise. -Body has to be multipart/form-data with key = `file` and value = the file. -Files with the same name will be overriden. - ---- - -- **Required role**: - Student or Teacher -- **URL** - `/api/exercises/:id/files` -- **Method** - `POST` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/11/files` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "fileName": "ex1.html", - "fileType": "text/html", - "size": 23 - }, - { - "fileName": "ex2.html", - "fileType": "text/html", - "size": 23 - } - ] - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise not found: 11 - ``` - -### Upload exercise template - -Upload a ZIP file to the template of an exercise. -Body has to be multipart/form-data with key = `file` and value = the file. -Files with the same name will be overriden. - ---- - -- **Required role**: - Teacher -- **URL** - `/api/exercises/:id/files/template` -- **Method** - `POST` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/11/files/template` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "fileName": "ex1.html", - "fileType": "text/html", - "size": 23 - }, - { - "fileName": "ex2.html", - "fileType": "text/html", - "size": 23 - } - ] - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise not found: 11 - ``` - -### Get all students' files - ---- - -Note: Content-Type is application/zip -Download the files assigned to an exercise for all students in a zip file. -Name of the file if template was downloaded: `exercise-{id}-files.zip` where {id} is the id of the exercise. - -- **Required role**: - Student or Teacher -- **URL** - `/api/exercises/:id/teachers/files` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/11/files/template` -- **Success Response** - - **Code**: 200 -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise not found: 11 - ``` - -### Get file info by exercise and owner - ---- - -Get information of all of the files owned by a user in an exercise. - -- **Required role**: - Student or Teacher -- **URL** - `/api/users/:userid/exercises/:exid/files` -- **Method** - `GET` -- **URL Params** - - **Required** - - `userid=[long]` - - `exid=[long]` - - **Example** - - `/api/users/4/exercises/3/files` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 32, - "path": "images\\imagePlaceholder.png", - "createDateTime": "2020-02-16T12:39:48", - "updateDateTime": "2020-02-16T12:39:48" - }, - { - "id": 35, - "path": "pom.xml", - "createDateTime": "2020-02-16T12:39:48", - "updateDateTime": "2020-02-16T12:39:48" - } - ] - ``` - - OR - - - **Code**: 204 - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: 322 - ``` - -### Get exercise user info for current user - ---- - -Get information about an exercise for a user. Current information recorded is: - -1. finished: If the student marked the exercise as finished - -- **Required role**: - Student, Teacher -- **URL** - `/api/exercises/:id/info` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/11/info` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 14, - "exercise": { - "id": 11, - "name": "Exercise 1", - "createDateTime": "2020-04-10T19:34:54", - "updateDateTime": "2020-04-10T19:34:54" - }, - "user": { - "id": 5, - "username": "johndoejr2", - "name": "John", - "lastName": "Doe Jr 2", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2020-04-10T19:34:54", - "updateDateTime": "2020-04-10T19:34:54" - }, - "finished": true, - "createDateTime": "2020-04-10T19:34:54", - "updateDateTime": "2020-04-10T19:34:54" - } - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise user info not found for user: johndoe. Exercise: 11 - ``` - -### Update exercise user info for current user - ---- - -Updates information about an exercise for a user. Current information recorded is: - -1. finished: If the student marked the exercise as finished - -- **Required role**: - Student, Teacher -- **URL** - `/api/exercises/:id/info` -- **Method** - `PUT` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/11/info` -- **Data Params** - - **Required**: - `"finished": [boolean]` - - **Example**: - - ```json - { - "finished": true - } - ``` - -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 14, - "exercise": { - "id": 11, - "name": "Exercise 1", - "createDateTime": "2020-04-10T19:34:54", - "updateDateTime": "2020-04-10T19:34:54" - }, - "user": { - "id": 5, - "username": "johndoejr2", - "name": "John", - "lastName": "Doe Jr 2", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2020-04-10T19:34:54", - "updateDateTime": "2020-04-10T19:34:54" - }, - "finished": true, - "createDateTime": "2020-04-10T19:34:54", - "updateDateTime": "2020-04-10T19:34:54" - } - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise user info not found for user: johndoe. Exercise: 11 - ``` - -### Get all students' exercise info - ---- - -Get all students' exercise info. Request has to be made by a teacher in the course. Current information recorded is: - -1. finished: If the student marked the exercise as finished - -- **Required role**: - Teacher -- **URL** - `/api/exercises/:id/info/teacher` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/11/info/teacher` -- **Success Response (Courses Found)** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 13, - "exercise": { - "id": 11, - "name": "Exercise 1", - "createDateTime": "2020-04-12T15:14:04", - "updateDateTime": "2020-04-12T15:14:04" - }, - "user": { - "id": 4, - "username": "johndoejr", - "name": "John", - "lastName": "Doe Jr 1", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2020-04-12T15:14:03", - "updateDateTime": "2020-04-12T15:14:03" - }, - "finished": false, - "createDateTime": "2020-04-12T15:14:04", - "updateDateTime": "2020-04-12T15:14:04" - }, - { - "id": 14, - "exercise": { - "id": 11, - "name": "Exercise 1", - "createDateTime": "2020-04-12T15:14:04", - "updateDateTime": "2020-04-12T15:14:04" - }, - "user": { - "id": 5, - "username": "johndoejr2", - "name": "John", - "lastName": "Doe Jr 2", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2020-04-12T15:14:03", - "updateDateTime": "2020-04-12T15:14:03" - }, - "finished": true, - "createDateTime": "2020-04-12T15:14:04", - "updateDateTime": "2020-04-12T15:14:04" - }, - { - "id": 15, - "exercise": { - "id": 11, - "name": "Exercise 1", - "createDateTime": "2020-04-12T15:14:04", - "updateDateTime": "2020-04-12T15:14:04" - }, - "user": { - "id": 6, - "username": "johndoejr3", - "name": "John", - "lastName": "Doe Jr 3", - "roles": [ - { - "roleName": "ROLE_STUDENT" - } - ], - "createDateTime": "2020-04-12T15:14:03", - "updateDateTime": "2020-04-12T15:14:03" - }, - "finished": true, - "createDateTime": "2020-04-12T15:14:04", - "updateDateTime": "2020-04-12T15:14:04" - } - - ] - ``` - -- **Success Response (No courses found)** - - **Code**: 204 - - **Content**: Empty - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: Exercise not found: 11 - ``` - - OR - -- **Code**: 401 -- **Content**: - - ```text - User is not in course or teacher is not in this course. - ``` - -## Comments - -### Add comment thread - -Adds or overwrites a comment thread to a file. - ---- - -- **Required role**: - Student or Teacher -- **URL** - `/api/files/:fileid/comments` -- **Method** - `POST` -- **URL Params** - - **Required** - - `fileid=[long]` - - **Example** - - `/api/files/322/comments` -- **Data Params** - - **Required**: - `"line": [long]` - Line of the file that contains a comment thread - `"lineText": [string]` - Text of the line in the file - `"comments": [Comment]` - Comments of the thread, which need to have the following required params: - `"author": [string]` - Author of the comment - `"body": [string]` - Content of the comment - - **Example**: - - ```json - { - "line": 0, - "lineText": "Test line", - "comments": [ - { - "author": "johndoe", - "body": "Test 1" - }, - { - "author": "johndoe", - "body": "Test 2" - } - ] - } - ``` - -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 345, - "comments": [ - { - "id": 346, - "body": "Test 1", - "author": "johndoe", - "createDateTime": "2020-02-15T16:15:30", - "updateDateTime": "2020-02-15T16:15:30" - }, - { - "id": 347, - "body": "Test 2", - "author": "johndoe", - "createDateTime": "2020-02-15T16:15:30", - "updateDateTime": "2020-02-15T16:15:30" - } - ], - "line": 0, - "lineText": "Test line", - "createDateTime": "2020-02-15T16:15:30", - "updateDateTime": "2020-02-15T16:15:30" - } - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: 322 - ``` - -### Get comment threads - ---- - -Get the posted comment threads of a file. - -- **Required role**: - Student or Teacher -- **URL** - `/api/files/:fileid/comments` -- **Method** - `GET` -- **URL Params** - - **Required** - - `fileid=[long]` - - **Example** - - `/api/files/322/comments` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 345, - "comments": [ - { - "id": 346, - "body": "Test 1", - "author": "johndoe", - "createDateTime": "2020-02-15T16:15:30", - "updateDateTime": "2020-02-15T16:15:30" - }, - { - "id": 347, - "body": "Test 2", - "author": "johndoe", - "createDateTime": "2020-02-15T16:15:30", - "updateDateTime": "2020-02-15T16:15:30" - } - ], - "line": 0, - "lineText": "Test line", - "createDateTime": "2020-02-15T16:15:30", - "updateDateTime": "2020-02-15T16:15:30" - } - ] - ``` - - OR - - - **Code**: 204 - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: 322 - ``` - -### Get comments by exercise and username - ---- - -Get the posted comment threads of the files owned by the given username in the given exercise. - -- **Required role**: - Student or Teacher -- **URL** - `/api/users/:username/exercises/:exerciseId/comments` -- **Method** - `GET` -- **URL Params** - - **Required** - - `username=[string]` - - `exerciseId=[long]` - - **Example** - - `/api/users/johndoejr3/exercises/10/comments` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - [ - { - "id": 333, - "path": "ej.html", - "comments": [ - { - "id": 346, - "comments": [ - { - "id": 347, - "body": "test", - "author": "johndoe", - "createDateTime": "2020-02-18T13:25:46", - "updateDateTime": "2020-02-18T13:25:46" - }, - { - "id": 348, - "body": "test 2", - "author": "johndoe", - "createDateTime": "2020-02-18T13:25:46", - "updateDateTime": "2020-02-18T13:25:46" - }, - { - "id": 349, - "body": "test 3", - "author": "johndoe", - "createDateTime": "2020-02-18T13:25:46", - "updateDateTime": "2020-02-18T13:25:46" - } - ], - "line": 0, - "lineText": "Test line", - "createDateTime": "2020-02-18T13:25:46", - "updateDateTime": "2020-02-18T13:25:46" - } - ], - "createDateTime": "2020-02-18T13:25:43", - "updateDateTime": "2020-02-18T13:25:43" - } - ] - ``` - - OR - - - **Code**: 204 - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: 322 - ``` - -### Update comment thread line - -Changes the line and line text of a comment thread line in the server. - ---- - -- **Required role**: - Student or Teacher -- **URL** - `/api/comments/:id` -- **Method** - `PUT` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/comments/322` -- **Data Params** - - **Required**: - `"line": [long]` - Line of the file that contains a comment thread - `"lineText": [string]` - Text of the line in the file - - **Example**: - - ```json - { - "line": 3, - "lineText": "New line" - } - ``` - -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 332, - "line": 3, - "lineText": "New line", - "createDateTime": "2020-02-15T16:15:30", - "updateDateTime": "2020-02-15T16:15:45" - } - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: 322 - ``` - -## Code sharing - -### Get course unique code - ---- - -Get course unique code for sharing. - -- **Required role**: - Teacher -- **URL** - `/api/courses/:id/code` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/courses/1/code` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```text - c53375af-82f7-4420-9d53-d787cf442cd2 - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: 1 - ``` - -### Get exercise unique code - ---- - -Get exercise unique code for sharing. - -- **Required role**: - Teacher -- **URL** - `/api/exercises/:id/code` -- **Method** - `GET` -- **URL Params** - - **Required** - - `id=[long]` - - **Example** - - `/api/exercises/1/code` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```text - c53375af-82f7-4420-9d53-d787cf442cd2 - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Not found: 1 - ``` - -### Get course and its exercises with sharing code - ---- - -Get a course and its exercises using the sharing code - -- **Required role**: - Student or Teacher -- **URL** - `/api/courses/code/:code` -- **Method** - `GET` -- **URL Params** - - **Required** - - `code=[string]` - - **Example** - - `/api/courses/code/f3db9572-0263-417e-a429-e8d7ef7f63e2` -- **Success Response** - - **Code**: 200 - - **Content**: - - ```json - { - "id": 7, - "name": "Spring Boot Course", - "exercises": [ - { - "id": 10, - "name": "Exercise 1", - "createDateTime": "2020-03-06T16:16:42", - "updateDateTime": "2020-03-06T16:16:42" - }, - { - "id": 11, - "name": "Exercise 2", - "createDateTime": "2020-03-06T16:16:42", - "updateDateTime": "2020-03-06T16:16:42" - }, - { - "id": 12, - "name": "Exercise 3", - "createDateTime": "2020-03-06T16:16:42", - "updateDateTime": "2020-03-06T16:16:42" - }, - { - "id": 13, - "name": "Exercise 4", - "createDateTime": "2020-03-06T16:16:42", - "updateDateTime": "2020-03-06T16:16:42" - }, - { - "id": 14, - "name": "Exercise 5", - "createDateTime": "2020-03-06T16:16:42", - "updateDateTime": "2020-03-06T16:16:42" - } - ], - "createDateTime": "2020-03-06T16:16:42", - "updateDateTime": "2020-03-06T16:16:42" - } - ``` - -- **Error Response** - - **Code**: 404 - - **Content**: - - ```text - Course not found: 1 - ``` diff --git a/vscode4teaching-server/Dockerfile b/vscode4teaching-server/Dockerfile deleted file mode 100644 index 4544b53b..00000000 --- a/vscode4teaching-server/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM adoptopenjdk/openjdk11:latest -RUN apt-get update && apt-get install -y netcat && rm -rf /var/lib/apt/lists/* -COPY ./target/vscode4teaching-server-*.jar ./app/vscode4teaching-server-*.jar -COPY ./docker/waitDB.sh ./app/waitDB.sh -EXPOSE 8080 -RUN ["chmod", "+x", "./app/waitDB.sh"] -CMD ["./app/waitDB.sh"] \ No newline at end of file diff --git a/vscode4teaching-server/README.md b/vscode4teaching-server/README.md index 150f89e0..f34837f0 100644 --- a/vscode4teaching-server/README.md +++ b/vscode4teaching-server/README.md @@ -14,8 +14,9 @@ ## API Documentation -Click [HERE](API.md) for the documentation on the REST API running on the server. -Click [HERE](WSAPI.md) for the documentation on the WebSocket API running on the server. +- [Click here](API.json) to navigate to the documentation on the REST API running on the server (in OpenAPI 3.0 JSON format). + You can also read this documentation in Swagger interactive web service by accessing ``{URL}/swagger-ui/index.html``, where ``{URL}`` has to be the URL where V4T has been deployed (e.g. if running at ``localhost:8080``, you can go to [http://localhost:8080/swagger-ui/index.html](http://localhost:8080/swagger-ui/index.html)). +- [Click here](WSAPI.md) to read the documentation on the WebSocket API running on the server. ## Docker diff --git a/vscode4teaching-server/docker/.env b/vscode4teaching-server/docker/.env index 505950d1..55c614dc 100644 --- a/vscode4teaching-server/docker/.env +++ b/vscode4teaching-server/docker/.env @@ -13,4 +13,4 @@ SUPERUSER_USERNAME=admin SUPERUSER_PASSWORD=admin SUPERUSER_EMAIL=admin@admin.com SUPERUSER_NAME=Admin -SUPERUSER_LASTNAME=Admin \ No newline at end of file +SUPERUSER_LASTNAME=Admin diff --git a/vscode4teaching-server/docker/docker-compose.yml b/vscode4teaching-server/docker/docker-compose.yml index 20fc2a4c..ac5ce79a 100644 --- a/vscode4teaching-server/docker/docker-compose.yml +++ b/vscode4teaching-server/docker/docker-compose.yml @@ -13,7 +13,7 @@ services: MYSQL_USER: ${SPRING_DATASOURCE_USERNAME} MYSQL_PASSWORD: ${SPRING_DATASOURCE_PASSWORD} app: - image: vscode4teaching/vscode4teaching:latest + image: vscode4teaching/vscode4teaching:2.1.0-beta1 links: - db depends_on: diff --git a/vscode4teaching-server/pom.xml b/vscode4teaching-server/pom.xml index d16dd617..1ea4a17b 100644 --- a/vscode4teaching-server/pom.xml +++ b/vscode4teaching-server/pom.xml @@ -6,13 +6,13 @@ org.springframework.boot spring-boot-starter-parent - 2.1.9.RELEASE - + 2.5.10 + com.vscode4teaching vscode4teaching-server - 2.0.2 + 2.1.1-beta VSCode 4 Teaching Server side of VSCode 4 Teaching extension. @@ -35,7 +35,7 @@ org.springframework.boot - spring-boot-starter-thymeleaf + spring-boot-starter-validation org.springframework.boot @@ -48,11 +48,14 @@ mysql-connector-java runtime + + org.springframework.boot + spring-boot-starter-websocket + org.springframework.boot spring-boot-starter-test test - junit @@ -60,7 +63,7 @@ org.mockito - mockito-core + mockito-inline @@ -76,7 +79,7 @@ org.mockito - mockito-core + mockito-inline org.mockito @@ -90,6 +93,7 @@ com.h2database h2 + 2.1.210 test @@ -97,14 +101,20 @@ jjwt 0.9.1 - - org.springframework.boot - spring-boot-starter-websocket - com.google.code.gson gson + + io.springfox + springfox-boot-starter + 3.0.0 + + + io.springfox + springfox-swagger-ui + 3.0.0 + @@ -141,11 +151,11 @@ org.apache.maven.plugins maven-compiler-plugin - 10 - 10 + 11 + 11 + - \ No newline at end of file diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/DatabaseFileInitializer.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/DatabaseFileInitializer.java index e605bd8d..f55b183b 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/DatabaseFileInitializer.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/DatabaseFileInitializer.java @@ -14,10 +14,7 @@ import javax.transaction.Transactional; -import com.vscode4teaching.vscode4teachingserver.model.Course; -import com.vscode4teaching.vscode4teachingserver.model.Exercise; -import com.vscode4teaching.vscode4teachingserver.model.ExerciseFile; -import com.vscode4teaching.vscode4teachingserver.model.User; +import com.vscode4teaching.vscode4teachingserver.model.*; import com.vscode4teaching.vscode4teachingserver.model.repositories.CourseRepository; import com.vscode4teaching.vscode4teachingserver.model.repositories.ExerciseFileRepository; import com.vscode4teaching.vscode4teachingserver.model.repositories.ExerciseRepository; @@ -59,9 +56,9 @@ public void run(String... args) throws IOException { // Find course, exercise and user String absolutePath = filePath.toAbsolutePath().toString(); int i = absolutePath.lastIndexOf(rootPath); - String[] parts = absolutePath.substring(i).split(Pattern.quote(File.separator)); + String[] parts = absolutePath.substring(i + rootPath.length()).split(Pattern.quote(File.separator)); String[] courseParts = parts[1].split("_"); - long course_id = Long.valueOf(courseParts[courseParts.length - 1]); + long course_id = Long.parseLong(courseParts[courseParts.length - 1]); Optional courseOpt = courseRepository.findById(course_id); // If not found build course name and try to find it if (!courseOpt.isPresent()) { @@ -83,7 +80,7 @@ public void run(String... args) throws IOException { Course course = courseOpt.get(); List exercises = course.getExercises(); String[] exerciseParts = parts[2].split("_"); - long exercise_id = Long.valueOf(exerciseParts[exerciseParts.length - 1]); + long exercise_id = Long.parseLong(exerciseParts[exerciseParts.length - 1]); List exercisePartsList = new ArrayList<>(Arrays.asList(exerciseParts)); exercisePartsList.remove(exerciseParts[exerciseParts.length - 1]); String exerciseName = String.join(" ", exercisePartsList); @@ -113,10 +110,16 @@ public void run(String... args) throws IOException { exercise.addFileToTemplate(file); exerciseRepository.save(exercise); } else { - Optional userOpt = course.getUsersInCourse().stream() - .filter(user -> user.getUsername().equals(parts[3])).findFirst(); - if (userOpt.isPresent()) { - User user = userOpt.get(); + String[] userParts = parts[3].split("_"); + Optional userInfoOpt = Optional.empty(); + try { + long userInfoId = Integer.parseInt(userParts[userParts.length - 1]); + userInfoOpt = exercise.getUserInfo().stream().filter(eui -> eui.getId().equals(userInfoId)).findFirst(); + } catch(NumberFormatException nfe) { + logger.error("File initialization for exercise " + exercise_id + " and user " + parts[3] + " went wrong."); + } + if (userInfoOpt.isPresent()) { + User user = userInfoOpt.get().getUser(); // When everything is found, save file to database ExerciseFile file = new ExerciseFile(absolutePath, user); fileRepository.save(file); diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/VS4TApplication.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/VS4TApplication.java index d1b3363a..555f585e 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/VS4TApplication.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/VS4TApplication.java @@ -1,11 +1,50 @@ package com.vscode4teaching.vscode4teachingserver; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.service.VendorExtension; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; +import java.util.ArrayList; + +@EnableSwagger2 @SpringBootApplication public class VS4TApplication { + @Value("${v4t.version}") + public String v4tVersion; + + /** + * API Documentation configuration (OpenAPI 3.0.3 format) + */ + @Bean + public Docket apiDocumentation() { + return new Docket(DocumentationType.OAS_30) + .select() + .apis(RequestHandlerSelectors.basePackage("com.vscode4teaching.vscode4teachingserver")) + .paths(PathSelectors.ant("/api/**")) + .build() + .apiInfo(new ApiInfo( + "VSCode4Teaching", + "VSCode4Teaching REST API Documentation.", + v4tVersion, + "", + new Contact("VSCode4Teaching", "https://github.com/codeurjc-students/2019-VSCode4Teaching", ""), + "V4T License (Apache-2.0 LICENSE)", + "https://github.com/codeurjc-students/2019-VSCode4Teaching/blob/master/LICENSE", + new ArrayList<>() + ) + ); + } + public static void main(String[] args) { SpringApplication.run(VS4TApplication.class, args); } diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/CourseController.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/CourseController.java index 1ab733f4..bad42a0b 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/CourseController.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/CourseController.java @@ -1,12 +1,5 @@ package com.vscode4teaching.vscode4teachingserver.controllers; -import java.util.List; -import java.util.Set; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import javax.validation.constraints.Min; - import com.fasterxml.jackson.annotation.JsonView; import com.vscode4teaching.vscode4teachingserver.controllers.dtos.CourseDTO; import com.vscode4teaching.vscode4teachingserver.controllers.dtos.UserRequest; @@ -16,27 +9,20 @@ import com.vscode4teaching.vscode4teachingserver.model.views.UserViews; import com.vscode4teaching.vscode4teachingserver.security.jwt.JWTTokenUtil; import com.vscode4teaching.vscode4teachingserver.services.CourseService; -import com.vscode4teaching.vscode4teachingserver.services.exceptions.CantRemoveCreatorException; -import com.vscode4teaching.vscode4teachingserver.services.exceptions.CourseNotFoundException; -import com.vscode4teaching.vscode4teachingserver.services.exceptions.NotCreatorException; -import com.vscode4teaching.vscode4teachingserver.services.exceptions.NotInCourseException; -import com.vscode4teaching.vscode4teachingserver.services.exceptions.TeacherNotFoundException; -import com.vscode4teaching.vscode4teachingserver.services.exceptions.UserNotFoundException; - +import com.vscode4teaching.vscode4teachingserver.services.exceptions.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import javax.validation.constraints.Min; +import java.util.List; +import java.util.Optional; +import java.util.Set; @RestController @RequestMapping("/api") @@ -61,6 +47,14 @@ public ResponseEntity> getAllCourses() { return !courses.isEmpty() ? ResponseEntity.ok(courses) : ResponseEntity.noContent().build(); } + @GetMapping("/courses/{courseId}") + @JsonView(CourseViews.CreatorView.class) + public ResponseEntity getCourse(@PathVariable @Min(1) Long courseId) { + Optional course = courseService.getCourseById(courseId); + logger.info("Course got: {}", course); + return course.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.noContent().build()); + } + @GetMapping("/courses/{courseId}/creator") @JsonView(UserViews.GeneralView.class) public ResponseEntity getCreator(@PathVariable @Min(1) Long courseId) throws CourseNotFoundException { @@ -78,18 +72,10 @@ public ResponseEntity addCourse(HttpServletRequest request, @Valid @Requ return new ResponseEntity<>(savedCourse, HttpStatus.CREATED); } - @GetMapping("/courses/code/{courseCode}") - @JsonView(CourseViews.ExercisesView.class) - public ResponseEntity getExercisesWithCode(HttpServletRequest request, @PathVariable String courseCode) - throws CourseNotFoundException, NotInCourseException, UserNotFoundException { - return ResponseEntity - .ok(courseService.getCourseWithSharingCode(courseCode, jwtTokenUtil.getUsernameFromToken(request))); - } - @PutMapping("/courses/{id}") @JsonView(CourseViews.CreatorView.class) public ResponseEntity updateCourse(HttpServletRequest request, @PathVariable @Min(1) Long id, - @Valid @RequestBody CourseDTO courseDTO) throws CourseNotFoundException, NotInCourseException { + @Valid @RequestBody CourseDTO courseDTO) throws CourseNotFoundException, NotInCourseException { Course course = new Course(courseDTO.getName()); Course savedCourse = courseService.editCourse(id, course, jwtTokenUtil.getUsernameFromToken(request)); return ResponseEntity.ok(savedCourse); @@ -119,7 +105,7 @@ public ResponseEntity> getUsersInCourse(@PathVariable @Min(1) Long cou @PostMapping("/courses/{courseId}/users") @JsonView(CourseViews.UsersView.class) public ResponseEntity addUserToCourse(@PathVariable @Min(1) Long courseId, - @Valid @RequestBody UserRequest userRequest, HttpServletRequest request) + @Valid @RequestBody UserRequest userRequest, HttpServletRequest request) throws UserNotFoundException, CourseNotFoundException, NotInCourseException { return ResponseEntity.ok(courseService.addUsersToCourse(courseId, userRequest.getIds(), jwtTokenUtil.getUsernameFromToken(request))); @@ -128,7 +114,7 @@ public ResponseEntity addUserToCourse(@PathVariable @Min(1) Long courseI @DeleteMapping("/courses/{courseId}/users") @JsonView(CourseViews.UsersView.class) public ResponseEntity removeUsersFromCourse(@PathVariable @Min(1) Long courseId, - @Valid @RequestBody UserRequest userRequest, HttpServletRequest request) + @Valid @RequestBody UserRequest userRequest, HttpServletRequest request) throws UserNotFoundException, CourseNotFoundException, NotInCourseException, CantRemoveCreatorException { return ResponseEntity.ok(courseService.removeUsersFromCourse(courseId, userRequest.getIds(), jwtTokenUtil.getUsernameFromToken(request))); @@ -139,4 +125,26 @@ public ResponseEntity getCode(@PathVariable Long courseId, HttpServletRe throws UserNotFoundException, CourseNotFoundException, NotInCourseException { return ResponseEntity.ok(courseService.getCourseCode(courseId, jwtTokenUtil.getUsernameFromToken(request))); } -} \ No newline at end of file + + @Deprecated // VERSION 2.1 AND LATER ARE NOT USING THIS METHOD, READ DOCS FOR FURTHER INFORMATION + @GetMapping("/courses/code/{courseCode}") + @JsonView(CourseViews.ExercisesView.class) + public ResponseEntity getExercisesWithCode(HttpServletRequest request, @PathVariable String courseCode) + throws CourseNotFoundException, NotInCourseException, UserNotFoundException { + return ResponseEntity.ok(courseService.joinCourseWithSharingCode(courseCode, jwtTokenUtil.getUsernameFromToken(request))); + } + + @GetMapping("/v2/courses/code/{courseCode}") + @JsonView(CourseViews.CreatorView.class) + public ResponseEntity getCourseInformationBySharingCode(@PathVariable String courseCode) + throws CourseNotFoundException, NotInCourseException, UserNotFoundException { + return ResponseEntity.ok(courseService.getCourseInformationWithSharingCode(courseCode)); + } + + @PutMapping("/courses/code/{courseCode}") + @JsonView(CourseViews.ExercisesView.class) + public ResponseEntity joinCourse(HttpServletRequest request, @PathVariable String courseCode) + throws CourseNotFoundException, NotInCourseException, UserNotFoundException { + return ResponseEntity.ok(courseService.joinCourseWithSharingCode(courseCode, jwtTokenUtil.getUsernameFromToken(request))); + } +} diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExceptionController.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExceptionController.java index 3365ed8f..974ab33f 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExceptionController.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExceptionController.java @@ -103,7 +103,8 @@ public ResponseEntity handleMalformedJwtException(MalformedJwtException return new ResponseEntity<>(e.getMessage(), HttpStatus.UNAUTHORIZED); } - @ExceptionHandler(value = { NotInCourseException.class, CantRemoveCreatorException.class, NotCreatorException.class }) + @ExceptionHandler(value = { NotInCourseException.class, CantRemoveCreatorException.class, + NotCreatorException.class }) @ResponseStatus(HttpStatus.FORBIDDEN) public ResponseEntity handleNotInCourseException(NotInCourseException e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.FORBIDDEN); @@ -116,7 +117,7 @@ public ResponseEntity handleNoTemplateException(NoTemplateException e) { } @ExceptionHandler(value = { ExerciseFinishedException.class, MultipartException.class, - EmptyJSONObjectException.class, EmptyURIException.class, MissingPropertyException.class}) + EmptyJSONObjectException.class, EmptyURIException.class, MissingPropertyException.class }) @ResponseStatus(HttpStatus.BAD_REQUEST) public ResponseEntity handleMultipartException(MultipartException e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExerciseController.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExerciseController.java index c2fd27f1..634d05e7 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExerciseController.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExerciseController.java @@ -1,8 +1,10 @@ package com.vscode4teaching.vscode4teachingserver.controllers; +import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; +import javax.transaction.Transactional; import javax.validation.Valid; import javax.validation.constraints.Min; @@ -46,7 +48,7 @@ public class ExerciseController { private final JWTTokenUtil jwtTokenUtil; public ExerciseController(CourseService courseService, ExerciseInfoService exerciseInfoService, - JWTTokenUtil jwtTokenUtil) { + JWTTokenUtil jwtTokenUtil) { this.courseService = courseService; this.jwtTokenUtil = jwtTokenUtil; this.exerciseInfoService = exerciseInfoService; @@ -60,6 +62,7 @@ public ResponseEntity> getExercises(HttpServletRequest request, @ return exercises.isEmpty() ? ResponseEntity.noContent().build() : ResponseEntity.ok(exercises); } + @Deprecated @PostMapping("/courses/{courseId}/exercises") @JsonView(ExerciseViews.CourseView.class) public ResponseEntity addExercise(HttpServletRequest request, @PathVariable @Min(1) Long courseId, @@ -70,10 +73,23 @@ public ResponseEntity addExercise(HttpServletRequest request, @PathVar return new ResponseEntity<>(savedExercise, HttpStatus.CREATED); } + @PostMapping("/v2/courses/{courseId}/exercises") + @JsonView(ExerciseViews.CourseView.class) + @Transactional + public ResponseEntity> addExercises(HttpServletRequest request, @PathVariable @Min(1) Long courseId, + @Valid @RequestBody ExerciseDTO[] exercisesDTO) throws CourseNotFoundException, NotInCourseException { + ArrayList savedExercises = new ArrayList<>(); + for (ExerciseDTO exerciseDTO : exercisesDTO) { + Exercise exercise = new Exercise(exerciseDTO.name); + savedExercises.add(courseService.addExerciseToCourse(courseId, exercise, jwtTokenUtil.getUsernameFromToken(request))); + } + return new ResponseEntity<>(savedExercises, HttpStatus.CREATED); + } + @PutMapping("/exercises/{exerciseId}") @JsonView(ExerciseViews.CourseView.class) public ResponseEntity updateExercise(HttpServletRequest request, @PathVariable @Min(1) Long exerciseId, - @RequestBody ExerciseDTO exerciseDTO) throws ExerciseNotFoundException, NotInCourseException { + @RequestBody ExerciseDTO exerciseDTO) throws ExerciseNotFoundException, NotInCourseException { Exercise exercise = new Exercise(exerciseDTO.getName()); return ResponseEntity .ok(courseService.editExercise(exerciseId, exercise, jwtTokenUtil.getUsernameFromToken(request))); @@ -96,7 +112,7 @@ public ResponseEntity getCode(@PathVariable Long exerciseId, HttpServlet @GetMapping("/exercises/{exerciseId}/info") @JsonView(ExerciseUserInfoViews.GeneralView.class) public ResponseEntity getExerciseUserInfo(@PathVariable Long exerciseId, - HttpServletRequest request) throws NotFoundException { + HttpServletRequest request) throws NotFoundException { return ResponseEntity .ok(exerciseInfoService.getExerciseUserInfo(exerciseId, jwtTokenUtil.getUsernameFromToken(request))); } @@ -112,7 +128,7 @@ public ResponseEntity updateExerciseUserInfo(@PathVariable Lon @GetMapping("/exercises/{exerciseId}/info/teacher") @JsonView(ExerciseUserInfoViews.GeneralView.class) public ResponseEntity> getAllExerciseUserInfo(@PathVariable Long exerciseId, - HttpServletRequest request) throws NotInCourseException, ExerciseNotFoundException { + HttpServletRequest request) throws NotInCourseException, ExerciseNotFoundException { List euis = exerciseInfoService.getAllStudentExerciseUserInfo(exerciseId, jwtTokenUtil.getUsernameFromToken(request)); return !euis.isEmpty() ? ResponseEntity.ok(euis) : ResponseEntity.noContent().build(); diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExerciseFilesController.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExerciseFilesController.java index caad9911..55c90a20 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExerciseFilesController.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ExerciseFilesController.java @@ -59,7 +59,7 @@ public void downloadExerciseFiles(@PathVariable Long id, HttpServletRequest requ String username = jwtTokenUtil.getUsernameFromToken(request); Map> filesMap = filesService.getExerciseFiles(id, username); Optional> optFiles = filesMap.values().stream().findFirst(); - List files = optFiles.isPresent() ? optFiles.get() : new ArrayList<>(); + List files = optFiles.orElseGet(ArrayList::new); String zipName = files.get(0).getParentFile().getName().equals(ExerciseFilesController.templateFolderName) ? "template-" + id : "exercise-" + id + "-" + username; @@ -67,10 +67,10 @@ public void downloadExerciseFiles(@PathVariable Long id, HttpServletRequest requ String[] header = headerFilename(zipName + ".zip"); response.addHeader(header[0], header[1]); String fileSeparatorPattern = Pattern.quote(File.separator); - String separator = files.get(0).getAbsolutePath().split( - fileSeparatorPattern + ExerciseFilesController.templateFolderName + fileSeparatorPattern).length > 1 + String separator = files.get(0).getAbsolutePath() + .split(fileSeparatorPattern + ExerciseFilesController.templateFolderName + fileSeparatorPattern).length > 1 ? ExerciseFilesController.templateFolderName - : username; + : "student_[0-9]*"; exportToZip(response, files, separator); } @@ -83,8 +83,7 @@ public ResponseEntity> uploadZip(@PathVariable Long id, Optional> optFiles = filesMap.values().stream().findFirst(); List files = optFiles.isPresent() ? optFiles.get() : new ArrayList<>(); List uploadResponse = new ArrayList<>(files.size()); - String fileSeparatorPattern = Pattern.quote(File.separator); - String pattern = fileSeparatorPattern + username + fileSeparatorPattern; + String pattern = "student_[0-9]*" + File.separator; for (File file : files) { String[] filePath = file.getCanonicalPath().split(pattern); uploadResponse.add(new UploadFileResponse(filePath[filePath.length - 1], @@ -148,16 +147,13 @@ private String[] headerFilename(String filename) { return headerElements; } - private void exportToZip(HttpServletResponse response, List files, String parentDirectory) - throws IOException { + private void exportToZip(HttpServletResponse response, List files, String parentDirectory) throws IOException { ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream()); for (File file : files) { try { - String fileSeparatorPattern = Pattern.quote(File.separator); - String pattern = null; - String[] filePath = null; - pattern = fileSeparatorPattern + parentDirectory + fileSeparatorPattern; - filePath = file.getCanonicalPath().split(pattern); + // pattern = fileSeparatorPattern + parentDirectory + fileSeparatorPattern; + String pattern = parentDirectory + File.separator; + String[] filePath = file.getCanonicalPath().split(pattern); String zipFilePath = filePath[filePath.length - 1].replace('\\', '/'); zipOutputStream.putNextEntry(new ZipEntry(zipFilePath)); FileInputStream fileInputStream = new FileInputStream(file); @@ -166,7 +162,7 @@ private void exportToZip(HttpServletResponse response, List files, String fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); - }finally { + } finally { zipOutputStream.closeEntry(); } diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/JWTLoginController.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/JWTLoginController.java index ec606e14..33bb590b 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/JWTLoginController.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/JWTLoginController.java @@ -1,10 +1,5 @@ package com.vscode4teaching.vscode4teachingserver.controllers; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - import com.fasterxml.jackson.annotation.JsonView; import com.vscode4teaching.vscode4teachingserver.controllers.dtos.JWTRequest; import com.vscode4teaching.vscode4teachingserver.controllers.dtos.JWTResponse; @@ -14,7 +9,6 @@ import com.vscode4teaching.vscode4teachingserver.security.jwt.JWTTokenUtil; import com.vscode4teaching.vscode4teachingserver.services.exceptions.NotFoundException; import com.vscode4teaching.vscode4teachingserver.servicesimpl.JWTUserDetailsService; - import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; @@ -23,12 +17,12 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; +import java.util.UUID; @RestController @RequestMapping("/api") @@ -42,7 +36,7 @@ public class JWTLoginController { private final PasswordEncoder bCryptPasswordEncoder; public JWTLoginController(AuthenticationManager authenticationManager, JWTTokenUtil jwtTokenUtil, - JWTUserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) { + JWTUserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) { this.authenticationManager = authenticationManager; this.jwtTokenUtil = jwtTokenUtil; this.userDetailsService = userDetailsService; @@ -72,6 +66,7 @@ public ResponseEntity saveUser(@Valid @RequestBody UserDTO userDto) { return new ResponseEntity<>(saveduser, HttpStatus.CREATED); } + @Deprecated // VERSION 2.1 AND LATER ARE NOT USING THIS METHOD, READ DOCS FOR FURTHER INFORMATION @PostMapping("/teachers/register") @JsonView(UserViews.EmailView.class) public ResponseEntity saveTeacher(@Valid @RequestBody UserDTO userDto) { @@ -82,6 +77,15 @@ public ResponseEntity saveTeacher(@Valid @RequestBody UserDTO userDto) { return new ResponseEntity<>(saveduser, HttpStatus.CREATED); } + @PostMapping("/teachers/invitation") + public ResponseEntity saveTeacherInvitation(@RequestBody UserDTO userDto) { + String tempPassword = UUID.randomUUID().toString(); + String encodedPassword = bCryptPasswordEncoder.encode(tempPassword); + userDetailsService.save(new User(userDto.getEmail(), userDto.getUsername(), encodedPassword, userDto.getName(), userDto.getLastName()), true); + userDto.setPassword(tempPassword); + return new ResponseEntity<>(userDto, HttpStatus.CREATED); + } + @GetMapping("/currentuser") @JsonView(UserViews.CourseView.class) public ResponseEntity getCurrentUser(HttpServletRequest request) throws NotFoundException { @@ -99,4 +103,25 @@ public ResponseEntity getCsrfToken() { public ResponseEntity> getAllUsers() { return ResponseEntity.ok(userDetailsService.findAll()); } -} \ No newline at end of file + + @PatchMapping("/users/{id}/password") + @JsonView(UserViews.GeneralView.class) + public ResponseEntity changePassword(HttpServletRequest req, @PathVariable Long id, @RequestBody String newPassword) { + // Step 1. User ID coming from request URL and body have to be the same + User user; + try { + user = userDetailsService.findByUsername(jwtTokenUtil.getUsernameFromToken(req)); + } catch (NotFoundException e) { + // If user is not found, an Unauthorized response is sent + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + if (id.equals(user.getId())) { + // Step 2. New password is encrypted and saved in DB + user.setPassword(bCryptPasswordEncoder.encode(newPassword)); + // Step 3. User is returned as response + return ResponseEntity.ok(userDetailsService.save(user, true)); + } + // If IDs do not match, a bad request is returned + return ResponseEntity.badRequest().build(); + } +} diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ViewController.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ViewController.java index 19cb294f..7f542f09 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ViewController.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/controllers/ViewController.java @@ -1,12 +1,19 @@ package com.vscode4teaching.vscode4teachingserver.controllers; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; @Controller +@CrossOrigin public class ViewController { - @RequestMapping("/") - public String loadHome() { - return "index"; + @GetMapping({"", "/"}) + public String redirect() { + return "forward:/app"; + } + + @GetMapping({"/app/**/{path:[^\\.]*}", "/{path:app[^\\.]*}"}) + public String serveAngularWebapp() { + return "forward:/index.html"; } } diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/Course.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/Course.java index 2a370703..4830f87d 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/Course.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/Course.java @@ -1,30 +1,17 @@ package com.vscode4teaching.vscode4teachingserver.model; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.validation.constraints.NotEmpty; - import com.fasterxml.jackson.annotation.JsonView; import com.vscode4teaching.vscode4teachingserver.model.views.CourseViews; - import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import org.hibernate.validator.constraints.Length; +import javax.persistence.*; +import javax.validation.constraints.NotEmpty; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + @Entity public class Course { @Id @@ -38,7 +25,7 @@ public class Course { private String name; @JsonView(CourseViews.CodeView.class) - private String uuid = UUID.randomUUID().toString(); + private final String uuid = UUID.randomUUID().toString(); @OneToMany(mappedBy = "course", cascade = CascadeType.REMOVE, orphanRemoval = true) @JsonView(CourseViews.ExercisesView.class) @@ -145,4 +132,4 @@ public Set getTeachers() { teachers.addAll(this.usersInCourse.stream().filter(u -> u.isTeacher()).collect(Collectors.toSet())); return teachers; } -} \ No newline at end of file +} diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/ExerciseUserInfo.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/ExerciseUserInfo.java index d895adae..66b883d7 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/ExerciseUserInfo.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/ExerciseUserInfo.java @@ -61,6 +61,15 @@ public ExerciseUserInfo(Exercise exercise, User user) { this.user = user; } + public Long getId(){ + return this.id; + } + + public void setId(Long id){ + this.id = id; + this.updateDateTime = LocalDateTime.now(ZoneOffset.UTC); + } + public Exercise getExercise() { return exercise; } diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/Role.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/Role.java index 4e9341fb..f53d656c 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/Role.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/Role.java @@ -1,15 +1,15 @@ package com.vscode4teaching.vscode4teachingserver.model; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonView; +import com.vscode4teaching.vscode4teachingserver.model.views.RoleViews; + import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.validation.constraints.NotEmpty; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonView; -import com.vscode4teaching.vscode4teachingserver.model.views.RoleViews; - @Entity public class Role { @Id @@ -44,5 +44,5 @@ public void setRoleName(String roleName) { this.roleName = roleName; } - -} \ No newline at end of file + +} diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/repositories/CourseRepository.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/repositories/CourseRepository.java index 93281ae0..4eac3b90 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/repositories/CourseRepository.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/model/repositories/CourseRepository.java @@ -7,7 +7,9 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface CourseRepository extends JpaRepository { + Optional findById(Long courseId); + Optional findByNameIgnoreCase(String name); Optional findByUuid(String uuid); -} \ No newline at end of file +} diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/security/SecurityConfig.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/security/SecurityConfig.java index 0cda9b80..346873bc 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/security/SecurityConfig.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/security/SecurityConfig.java @@ -43,19 +43,25 @@ public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception protected void configure(HttpSecurity http) throws Exception { final String teacherRole = "TEACHER"; final String studentRole = "STUDENT"; - http.authorizeRequests().antMatchers(HttpMethod.GET, "/api/courses", "/api/csrf", "/api/courses/*/creator", "/", "/img/**", "/js/**", "/css/**", "/fonts/**") - .permitAll().antMatchers(HttpMethod.POST, "/api/login", "/api/register").permitAll() - .antMatchers(HttpMethod.POST, "/api/teachers/register", "/api/exercises/*/teachers/**") - .hasAnyRole(teacherRole) - .antMatchers(HttpMethod.POST, "/api/courses", "/api/courses/*/exercises", "/api/courses/*/users") + http.authorizeRequests() + .antMatchers(HttpMethod.GET, "/api/courses", "/api/csrf", "/api/courses/code/*", "/api/v2/courses/code/*", "/api/courses/*/creator") + .permitAll() + .antMatchers(HttpMethod.POST, "/api/login", "/api/register", "/api/teachers/register", "/api/teachers/invitation") + .permitAll() + .antMatchers(HttpMethod.POST, "/api/exercises/*/teachers/**", "/api/courses", "/api/courses/*/exercises", "/api/v2/courses/*/exercises", "/api/courses/*/users") .hasAnyRole(teacherRole) .antMatchers(HttpMethod.PUT, "/api/courses/*", "/api/courses/*/exercises/*", "/api/exercises/*") .hasAnyRole(teacherRole) .antMatchers(HttpMethod.DELETE, "/api/courses/*", "/api/courses/*/exercises/*", "/api/exercises/*") - .hasAnyRole(teacherRole).antMatchers(HttpMethod.POST, "/api/exercises/*/files/template") - .hasAnyRole(teacherRole).antMatchers(HttpMethod.GET, "/api/exercises/*/info/teacher") - .hasAnyRole(teacherRole).anyRequest().hasAnyRole(studentRole).and().csrf() - .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and().exceptionHandling() + .hasAnyRole(teacherRole) + .antMatchers(HttpMethod.POST, "/api/exercises/*/files/template") + .hasAnyRole(teacherRole) + .antMatchers(HttpMethod.GET, "/api/exercises/*/info/teacher") + .hasAnyRole(teacherRole) + .antMatchers("/api/**") + .hasAnyRole(studentRole) + .anyRequest().permitAll().and() + .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and().exceptionHandling() .authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS); @@ -72,4 +78,4 @@ public PasswordEncoder passwordEncoder() { public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } -} \ No newline at end of file +} diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/services/CourseService.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/services/CourseService.java index a5587b8f..f866ea0e 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/services/CourseService.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/services/CourseService.java @@ -1,6 +1,7 @@ package com.vscode4teaching.vscode4teachingserver.services; import java.util.List; +import java.util.Optional; import java.util.Set; import javax.validation.Valid; @@ -25,6 +26,8 @@ public interface CourseService { public List getAllCourses(); + public Optional getCourseById(Long courseId); + public Course registerNewCourse(@Valid Course course, String requestUsername) throws TeacherNotFoundException; public User getCreator(@Min(1) Long courseId) throws CourseNotFoundException; @@ -41,9 +44,12 @@ public void deleteCourse(@Min(1) Long courseId, String requestUsername) public List getExercises(@Min(1) Long courseId, String requestUsername) throws CourseNotFoundException, NotInCourseException; - public Course getCourseWithSharingCode(String uuid, String requestUsername) + public Course joinCourseWithSharingCode(String uuid, String requestUsername) throws CourseNotFoundException, NotInCourseException, UserNotFoundException; + public Course getCourseInformationWithSharingCode(String uuid) + throws CourseNotFoundException; + public Exercise editExercise(@Min(1) Long exerciseId, @Valid Exercise exerciseData, String requestUsername) throws NotInCourseException, ExerciseNotFoundException; @@ -66,4 +72,4 @@ public String getCourseCode(Long courseId, String requestUsername) public String getExerciseCode(Long exerciseId, String requestUsername) throws UserNotFoundException, ExerciseNotFoundException, NotInCourseException; -} \ No newline at end of file +} diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/servicesimpl/CourseServiceImpl.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/servicesimpl/CourseServiceImpl.java index d4a7ae58..37fcacdb 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/servicesimpl/CourseServiceImpl.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/servicesimpl/CourseServiceImpl.java @@ -53,6 +53,11 @@ public List getAllCourses() { return this.courseRepo.findAll(); } + @Override + public Optional getCourseById(Long courseId) { + return this.courseRepo.findById(courseId); + } + @Override public Course registerNewCourse(Course course, String requestUsername) throws TeacherNotFoundException { Optional teacherOpt = userRepo.findByUsername(requestUsername); @@ -116,7 +121,7 @@ public List getExercises(Long courseId, String requestUsername) } @Override - public Course getCourseWithSharingCode(String uuid, String requestUsername) + public Course joinCourseWithSharingCode(String uuid, String requestUsername) throws CourseNotFoundException, NotInCourseException, UserNotFoundException { Course course = this.courseRepo.findByUuid(uuid).orElseThrow(() -> new CourseNotFoundException(uuid)); User user = userRepo.findByUsername(requestUsername) @@ -130,6 +135,12 @@ public Course getCourseWithSharingCode(String uuid, String requestUsername) return courseRepo.save(course); } + @Override + public Course getCourseInformationWithSharingCode(String uuid) + throws CourseNotFoundException{ + return this.courseRepo.findByUuid(uuid).orElseThrow(() -> new CourseNotFoundException(uuid)); + } + @Override public Exercise editExercise(Long exerciseId, Exercise exerciseData, String requestUsername) throws ExerciseNotFoundException, NotInCourseException { @@ -219,4 +230,4 @@ public String getExerciseCode(Long exerciseId, String requestUsername) return exercise.getUuid(); } -} \ No newline at end of file +} diff --git a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/servicesimpl/ExerciseFilesServiceImpl.java b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/servicesimpl/ExerciseFilesServiceImpl.java index 320517a1..c54184e6 100644 --- a/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/servicesimpl/ExerciseFilesServiceImpl.java +++ b/vscode4teaching-server/src/main/java/com/vscode4teaching/vscode4teachingserver/servicesimpl/ExerciseFilesServiceImpl.java @@ -90,27 +90,25 @@ public Map> saveExerciseFiles(@Min(1) Long exerciseId, Mult if (eui.getStatus() == 1) { throw new ExerciseFinishedException(exerciseId); } - return saveFiles(exerciseId, file, requestUsername, false); + return saveFiles(exerciseId, file, requestUsername, eui); } @Override public Map> saveExerciseTemplate(@Min(1) Long exerciseId, MultipartFile file, String requestUsername) throws ExerciseNotFoundException, NotInCourseException, IOException { - return saveFiles(exerciseId, file, requestUsername, true); + return saveFiles(exerciseId, file, requestUsername, null); } private Map> saveFiles(Long exerciseId, MultipartFile file, String requestUsername, - boolean isTemplate) throws ExerciseNotFoundException, NotInCourseException, IOException { + ExerciseUserInfo eui) throws ExerciseNotFoundException, NotInCourseException, IOException { Exercise exercise = exerciseRepository.findById(exerciseId) .orElseThrow(() -> new ExerciseNotFoundException(exerciseId)); Course course = exercise.getCourse(); User user = userRepository.findByUsername(requestUsername) .orElseThrow(() -> new NotInCourseException("User not in course: " + requestUsername)); - ExceptionUtil.throwExceptionIfNotInCourse(course, requestUsername, isTemplate); - String lastFolderPath = isTemplate ? "template" : requestUsername; - // For example, for root path "v4t_courses", a course "Course 1" with id 34, an exercise "Exercise 1" with id 77 - // and a user "john.doe" the final directory path would be - // v4t_courses/course_1_34/exercise_1_77/john.doe + ExceptionUtil.throwExceptionIfNotInCourse(course, requestUsername, (eui == null)); + // eui is null if file is a template, otherwise it'll be a normal eui + String lastFolderPath = (eui == null) ? "template" : "student_" + eui.getId(); Path targetDirectory = Paths.get(rootPath + File.separator + course.getName().toLowerCase().replace(" ", "_") + "_" + course.getId() + File.separator + exercise.getName().toLowerCase().replace(" ", "_") + "_" + exercise.getId() + File.separator + lastFolderPath).toAbsolutePath().normalize(); @@ -143,7 +141,7 @@ private Map> saveFiles(Long exerciseId, MultipartFile file, ExerciseFile exFile = new ExerciseFile(destFile.getCanonicalPath()); try { if (!fileRepository.findByPath(destFile.getCanonicalPath()).isPresent()) { - if (isTemplate) { + if (eui == null) { ExerciseFile savedFile = fileRepository.save(exFile); exercise.addFileToTemplate(savedFile); } else { @@ -215,16 +213,15 @@ public List getFileIdsByExerciseAndOwner(@Min(1) Long exerciseId, .orElseThrow(() -> new ExerciseNotFoundException(exerciseId)); List files = ex.getFilesByOwner(ownerUsername); if (!files.isEmpty()) { - String username = files.get(0).getOwner().getUsername(); List copyFiles = new ArrayList<>(files); - // Change paths to be relative to username + // Change paths to be relative to student's folder (named "student_{number}") copyFiles.forEach((ExerciseFile file) -> { String separator = File.separator; if (File.separator.contains("\\")) { separator = "\\" + File.separator; } - file.setPath(file.getPath().split(username + separator)[1]); + file.setPath(file.getPath().split("student_[0-9]*" + separator)[1]); }); return copyFiles; } else { @@ -232,4 +229,4 @@ public List getFileIdsByExerciseAndOwner(@Min(1) Long exerciseId, } } -} \ No newline at end of file +} diff --git a/vscode4teaching-server/src/main/resources/application.properties b/vscode4teaching-server/src/main/resources/application.properties index fb21c7b9..8b66c81c 100644 --- a/vscode4teaching-server/src/main/resources/application.properties +++ b/vscode4teaching-server/src/main/resources/application.properties @@ -1,20 +1,36 @@ -spring.jpa.hibernate.ddl-auto=create-drop +# DB Configuration spring.datasource.url=jdbc:mysql://localhost:3306/vsc4teach?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password= +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect +spring.jpa.properties.hibernate.dialect.storage_engine=innodb + +# Multipart Files configuration spring.servlet.multipart.max-file-size=1GB spring.servlet.multipart.max-request-size=2GB -server.tomcat.max-http-post-size=2GB +server.tomcat.max-http-form-post-size=2GB + +# Version Configuration (read from Maven POM) +v4t.version=@project.version@ + +# Default Exercises Directory (from V4T Server's root directory) v4t.filedirectory=v4t-course + +# Timezone Configuration spring.jpa.properties.hibernate.jdbc.time_zone=UTC -#IMPORTANT Change in production + +# Security Configuration (secret for JWT encryption) +# IMPORTANT: change in production jwt.secret=vscode4teaching + +# Initialization Configuration: inicialization of demo data and files data.initialization=true file.initialization=true + +# Superuser Configuration superuser.username=admin superuser.password=admin superuser.email=admin@admin.com superuser.name=Admin superuser.lastname=Admin -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect -spring.jpa.properties.hubernate.dialect.storage_engine=innodb \ No newline at end of file diff --git a/vscode4teaching-server/src/main/resources/static/css/style.css b/vscode4teaching-server/src/main/resources/static/css/style.css deleted file mode 100644 index df511138..00000000 --- a/vscode4teaching-server/src/main/resources/static/css/style.css +++ /dev/null @@ -1,91 +0,0 @@ -body { -} - -header { - background-color: white; - grid-area: header; - height: 100px; - display: flex; - align-items: center; - justify-content: center; - margin: 20px; -} - -header > img.logo { - height: 100%; - margin-left: 10px; -} - -section { - border: 2px solid black; - border-radius: 10px; - grid-area: section; - text-align: center; - margin: 2rem 3%; -} - -section > h1.title { - text-align: center; - font-family: moon-get-heavy, serif; -} - -.text-body { - margin: 1rem; - font-family: louis-george-cafe, serif; - font-size: 25px; -} - -.demo-gif { - width: 950px; - max-width: 85vw; -} - -@font-face { - font-family: louis-george-cafe; - src: url("../fonts/Louis George Cafe.ttf"); -} - -@font-face { - font-family: moon-get-heavy; - src: url("../fonts/moon_get-Heavy.otf"); -} - -@font-face { - font-family: Comfortaa; - src: url("../fonts/Comfortaa-Light.ttf"); -} - - -#download { - display: inline-flex; - align-items: center; - justify-content: space-between; - text-transform: uppercase; - border: 2px solid #0987f3; - background-color: hsl(197, 69%, 94%); - padding: 2px 4px; - font-family: Comfortaa, serif; -} - -#download > img { - width: 40px; - margin-right: 16px; -} - -#download > span { - color: black; - font-weight: bold; -} - -#download:link, -#download:visited { - text-decoration: none; -} - -#download:hover { - background-color: hsl(197, 64%, 78%); -} - -h3{ - font-family: louis-george-cafe, serif; -} \ No newline at end of file diff --git a/vscode4teaching-server/src/main/resources/static/img/vscode.svg b/vscode4teaching-server/src/main/resources/static/img/vscode.svg deleted file mode 100644 index 1eeb2b0d..00000000 --- a/vscode4teaching-server/src/main/resources/static/img/vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vscode4teaching-server/src/main/resources/templates/index.html b/vscode4teaching-server/src/main/resources/templates/index.html deleted file mode 100644 index cfe6f330..00000000 --- a/vscode4teaching-server/src/main/resources/templates/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - V4T - - - - - -
- -
-
-

VSCode 4 Teaching

-

Extension for Visual Studio Code

-
-
-

- Bring the programming exercises of a course directly to the student's editor, so that the teacher of - that - course can check the progress of the students and help them. -

-

Tutorial

-

Install V4T!:

- -

The first time you will have to sign up. After that you can log in:

- Students signup demo -

Join a course (the teacher will give you the code!):

- Students code usage demo -

Now you can do the exercise! When you save a file, its contents will be able to be seen by the teachers:

- Students edit exercise demo -

When you finish the exercise, push the Finish button:

- Students finish exercise demo -

New exercise! Refresh the list of exercises in the course:

- Students new exercise demo -
-
- - - - - \ No newline at end of file diff --git a/vscode4teaching-server/src/main/resources/test.properties b/vscode4teaching-server/src/main/resources/test.properties index ce4fb1f8..d091b065 100644 --- a/vscode4teaching-server/src/main/resources/test.properties +++ b/vscode4teaching-server/src/main/resources/test.properties @@ -1,10 +1,18 @@ -spring.datasource.url=jdbc:h2:mem:testdb -spring.datasource.driverClassName=org.h2.Driver +# DB Configuration +spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;NON_KEYWORDS=user spring.datasource.username=sa spring.datasource.password=password +spring.datasource.driverClassName=org.h2.Driver spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.generate-ddl=true +spring.jpa.hibernate.ddl-auto=create-drop + +# Default Exercises Directory (from V4T Server's root directory) v4t.filedirectory=v4t-course-test -#IMPORTANT Change in production + +# Security Configuration (secret for JWT encryption) +# IMPORTANT: change in production jwt.secret=vscode4teaching + +# Initialization Configuration: inicialization of demo data and files file.initialization=false -spring.datasource.initialization-mode=never \ No newline at end of file diff --git a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/ExerciseControllerTests.java b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/ExerciseControllerTests.java index 56301927..785f3f06 100644 --- a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/ExerciseControllerTests.java +++ b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/ExerciseControllerTests.java @@ -9,6 +9,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.AdditionalAnswers.returnsElementsOf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -37,6 +38,7 @@ import com.vscode4teaching.vscode4teachingserver.services.ExerciseInfoService; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.slf4j.Logger; @@ -86,11 +88,11 @@ public void addExercise_valid() throws Exception { logger.info("Test addExercise_valid() begins."); Course course = new Course("Spring Boot Course"); - Long courseId = 1l; + Long courseId = 1L; course.setId(courseId); Exercise expectedExercise = new Exercise(); expectedExercise.setName("Spring Boot Exercise 1"); - expectedExercise.setId(2l); + expectedExercise.setId(2L); expectedExercise.setCourse(course); ExerciseDTO exerciseDTO = new ExerciseDTO(); exerciseDTO.setName("Spring Boot Exercise 1"); @@ -98,8 +100,8 @@ public void addExercise_valid() throws Exception { .thenReturn(expectedExercise); MvcResult mvcResult = mockMvc - .perform(post("/api/courses/{courseId}/exercises", courseId).contentType("application/json") - .with(csrf()).content(objectMapper.writeValueAsString(exerciseDTO)) + .perform(post("/api/v2/courses/{courseId}/exercises", courseId).contentType("application/json") + .with(csrf()).content(objectMapper.writeValueAsString(List.of(exerciseDTO))) .header("Authorization", "Bearer " + jwtToken.getJwtToken())) .andDo(MockMvcResultHandlers.print()).andExpect(status().isCreated()).andReturn(); @@ -108,7 +110,7 @@ public void addExercise_valid() throws Exception { assertThat(exerciseCaptor.getValue().getName()).isEqualTo("Spring Boot Exercise 1"); String actualResponseBody = mvcResult.getResponse().getContentAsString(); String expectedResponseBody = objectMapper.writerWithView(ExerciseViews.CourseView.class) - .writeValueAsString(expectedExercise); + .writeValueAsString(List.of(expectedExercise)); assertThat(expectedResponseBody).isEqualToIgnoringWhitespace(actualResponseBody); logger.info("Test addExercise_valid() ends."); @@ -119,11 +121,11 @@ public void addExercise_invalid() throws Exception { logger.info("Test addExercise_invalid() begins."); Course course = new Course("Spring Boot Course"); - Long courseId = 1l; + Long courseId = 1L; course.setId(courseId); ExerciseDTO exercise = new ExerciseDTO(); - mockMvc.perform(post("/api/courses/{courseId}/exercises", courseId).contentType("application/json").with(csrf()) + mockMvc.perform(post("/api/v2/courses/{courseId}/exercises", courseId).contentType("application/json").with(csrf()) .header("Authorization", "Bearer " + jwtToken.getJwtToken()) .content(objectMapper.writeValueAsString(exercise))).andExpect(status().isBadRequest()); @@ -132,20 +134,58 @@ public void addExercise_invalid() throws Exception { logger.info("Test addExercise_invalid() ends."); } + @Test + public void addMultipleExercises_valid() throws Exception { + logger.info("Test addMultipleExercises_valid() begins."); + int number = (int) (Math.random() * 11); + logger.info("Number: " + number); + Course course = new Course("Spring Boot Course"); + Long courseId = 1L; + course.setId(courseId); + List exercisesList = new ArrayList<>(); + List expectedExercises = new ArrayList<>(); + for (int i = 1; i <= number; i++){ + ExerciseDTO dto = new ExerciseDTO(); + dto.setName("Exercise " + i); + Exercise exercise = new Exercise(); + exercise.setName("Exercise " + i); + exercise.setId((long) (1 + i)); + exercise.setCourse(course); + exercisesList.add(dto); + expectedExercises.add(exercise); + } + + when(courseService.addExerciseToCourse(any(Long.class), any(Exercise.class), anyString())) + .then(returnsElementsOf(expectedExercises)); + + MvcResult mvcResult = mockMvc + .perform(post("/api/v2/courses/{courseId}/exercises", courseId).contentType("application/json") + .with(csrf()).content(objectMapper.writeValueAsString(exercisesList.toArray())) + .header("Authorization", "Bearer " + jwtToken.getJwtToken())) + .andDo(MockMvcResultHandlers.print()).andExpect(status().isCreated()).andReturn(); + + String actualResponseBody = mvcResult.getResponse().getContentAsString(); + String expectedResponseBody = objectMapper.writerWithView(ExerciseViews.CourseView.class) + .writeValueAsString(expectedExercises.toArray()); + assertThat(expectedResponseBody).isEqualToIgnoringWhitespace(actualResponseBody); + + logger.info("Test addMultipleExercises_valid() ends."); + } + @Test public void getExercises_valid() throws Exception { logger.info("Test getExercises_valid() begins."); Course course = new Course("Spring Boot Course"); - Long courseId = 1l; + Long courseId = 1L; course.setId(courseId); Exercise exercise1 = new Exercise(); exercise1.setName("Spring Boot Exercise 1"); - exercise1.setId(2l); + exercise1.setId(2L); exercise1.setCourse(course); Exercise exercise2 = new Exercise(); exercise2.setName("Spring Boot Exercise 2"); - exercise2.setId(3l); + exercise2.setId(3L); exercise2.setCourse(course); course.addExercise(exercise1); course.addExercise(exercise2); @@ -167,13 +207,13 @@ public void getExercises_valid() throws Exception { } @Test - public void editExercise_valid() throws JsonProcessingException, Exception { + public void editExercise_valid() throws Exception { logger.info("Test editCourse_valid() begins."); ExerciseDTO exercise = new ExerciseDTO(); Exercise expectedExercise = new Exercise(); expectedExercise.setName("Spring Boot Exercise 1 v2"); - expectedExercise.setId(1l); + expectedExercise.setId(1L); expectedExercise.setCourse(new Course("Spring Boot Course")); exercise.setName("Spring Boot Exercise 1 v2"); when(courseService.editExercise(anyLong(), any(Exercise.class), anyString())).thenReturn(expectedExercise); @@ -208,46 +248,45 @@ public void deleteExercise_valid() throws Exception { @Test public void getCode_valid() throws Exception { Exercise ex = new Exercise("Spring Boot Exercise 1"); - ex.setId(1l); + ex.setId(1L); String code = ex.getUuid(); - when(courseService.getExerciseCode(1l, "johndoe")).thenReturn(code); + when(courseService.getExerciseCode(1L, "johndoe")).thenReturn(code); MvcResult mvcResult = mockMvc .perform(get("/api/exercises/1/code").contentType("application/json").with(csrf()) .header("Authorization", "Bearer " + jwtToken.getJwtToken())) .andDo(MockMvcResultHandlers.print()).andExpect(status().isOk()).andReturn(); - verify(courseService, times(1)).getExerciseCode(1l, "johndoe"); + verify(courseService, times(1)).getExerciseCode(1L, "johndoe"); String actualResponseBody = mvcResult.getResponse().getContentAsString(); - String expectedResponseBody = code; - assertThat(expectedResponseBody).isEqualToIgnoringWhitespace(actualResponseBody); + assertThat(code).isEqualToIgnoringWhitespace(actualResponseBody); } @Test public void getExerciseInfo_valid() throws Exception { Exercise ex = new Exercise("Spring Boot Exercise 1"); - ex.setId(1l); + ex.setId(1L); Role studentRole = new Role("ROLE_STUDENT"); Role teacherRole = new Role("ROLE_TEACHER"); User user = new User("johndoe@john.com", "johndoe", "password", "John", "Doe", studentRole); - user.setId(4l); + user.setId(4L); User creator = new User("johndoesr@john.com", "johndoesr", "passwordsr", "John", "Doe Sr", studentRole, teacherRole); - creator.setId(15l); + creator.setId(15L); Course course = new Course("Spring Boot Course"); course.addExercise(ex); ex.setCourse(course); course.setCreator(creator); course.addUserInCourse(user); ExerciseUserInfo eui = new ExerciseUserInfo(ex, user); - when(exerciseInfoService.getExerciseUserInfo(1l, "johndoe")).thenReturn(eui); + when(exerciseInfoService.getExerciseUserInfo(1L, "johndoe")).thenReturn(eui); MvcResult mvcResult = mockMvc .perform(get("/api/exercises/1/info").contentType("application/json").with(csrf()) .header("Authorization", "Bearer " + jwtToken.getJwtToken())) .andDo(MockMvcResultHandlers.print()).andExpect(status().isOk()).andReturn(); - verify(exerciseInfoService, times(1)).getExerciseUserInfo(1l, "johndoe"); + verify(exerciseInfoService, times(1)).getExerciseUserInfo(1L, "johndoe"); String actualResponseBody = mvcResult.getResponse().getContentAsString(); String expectedResponseBody = objectMapper.writerWithView(ExerciseUserInfoViews.GeneralView.class) .writeValueAsString(eui); @@ -257,9 +296,9 @@ public void getExerciseInfo_valid() throws Exception { @Test public void updateExerciseUserInfo_valid() throws Exception { Exercise ex = new Exercise("Spring Boot Exercise 1"); - ex.setId(1l); + ex.setId(1L); User user = new User("johndoe@john.com", "johndoe", "password", "John", "Doe"); - user.setId(4l); + user.setId(4L); ExerciseUserInfoDTO euiDTO = new ExerciseUserInfoDTO(); euiDTO.setStatus(1); ArrayList euiModifiedFiles = new ArrayList<>(); @@ -286,10 +325,10 @@ public void getAllStudentExerciseUserInfo_valid() throws Exception { // Set up courses and exercises Course course = new Course("Spring Boot Course"); Exercise exercise = new Exercise("Exercise 1", course); - exercise.setId(10l); + exercise.setId(10L); // Set up users Role studentRole = new Role("ROLE_STUDENT"); - studentRole.setId(2l); + studentRole.setId(2L); User student1 = new User("johndoejr@gmail.com", "johndoejr", "pass", "John", "Doe Jr 1"); student1.addRole(studentRole); student1.addCourse(course); @@ -305,7 +344,7 @@ public void getAllStudentExerciseUserInfo_valid() throws Exception { List expectedList = new ArrayList<>(2); expectedList.add(euiStudent1); expectedList.add(euiStudent2); - when(exerciseInfoService.getAllStudentExerciseUserInfo(10l, "johndoe")).thenReturn(expectedList); + when(exerciseInfoService.getAllStudentExerciseUserInfo(10L, "johndoe")).thenReturn(expectedList); MvcResult mvcResult = mockMvc .perform(get("/api/exercises/10/info/teacher").contentType("application/json").with(csrf()) diff --git a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/ExerciseFilesControllerTests.java b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/ExerciseFilesControllerTests.java index 5dc492e1..b148788e 100644 --- a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/ExerciseFilesControllerTests.java +++ b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/ExerciseFilesControllerTests.java @@ -96,10 +96,10 @@ public void cleanup() { @Test public void downloadFilesFromExercise_exercise() throws Exception { Exercise exercise = new Exercise("Exercise 1"); - exercise.setId(1l); + exercise.setId(1L); List files = new ArrayList<>(); - files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/johndoe/ej1.txt")); - files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/johndoe/ej2.txt")); + files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/student_13/ej1.txt")); + files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/student_13/ej2.txt")); for (File file : files) { file.getParentFile().mkdirs(); file.createNewFile(); @@ -159,20 +159,20 @@ public void uploadFile() throws Exception { exercise.setId(1l); byte[] mock = null; MockMultipartFile mockMultiFile1 = new MockMultipartFile("file", "exs.zip", "application/zip", mock); - Files.createDirectories(Paths.get("v4t-course-test/spring_boot_course_2/exercise_1_1/johndoe/ex3")); + Files.createDirectories(Paths.get("v4t-course-test/spring_boot_course_2/exercise_1_1/student_13/ex3")); Path path1 = Paths.get("src/test/java/com/vscode4teaching/vscode4teachingserver/files/ex1.html"); - Path path1Copy = Paths.get("v4t-course-test/spring_boot_course_2/exercise_1_1/johndoe/ex1.html"); + Path path1Copy = Paths.get("v4t-course-test/spring_boot_course_2/exercise_1_1/student_13/ex1.html"); Files.copy(path1, path1Copy, StandardCopyOption.REPLACE_EXISTING); Path path2 = Paths.get("src/test/java/com/vscode4teaching/vscode4teachingserver/files/ex2.html"); - Path path2Copy = Paths.get("v4t-course-test/spring_boot_course_2/exercise_1_1/johndoe/ex2.html"); + Path path2Copy = Paths.get("v4t-course-test/spring_boot_course_2/exercise_1_1/student_13/ex2.html"); Files.copy(path2, path2Copy, StandardCopyOption.REPLACE_EXISTING); Path path3 = Paths.get("src/test/java/com/vscode4teaching/vscode4teachingserver/files/ex3/ex3.html"); - Path path3Copy = Paths.get("v4t-course-test/spring_boot_course_2/exercise_1_1/johndoe/ex3/ex3.html"); + Path path3Copy = Paths.get("v4t-course-test/spring_boot_course_2/exercise_1_1/student_13/ex3/ex3.html"); Files.copy(path3, path3Copy, StandardCopyOption.REPLACE_EXISTING); - File mockFile1 = new File("v4t-course-test/spring_boot_course_2/exercise_1_1/johndoe/", "ex1.html"); - File mockFile2 = new File("v4t-course-test/spring_boot_course_2/exercise_1_1/johndoe/", "ex2.html"); - File mockFile3 = new File("v4t-course-test/spring_boot_course_2/exercise_1_1/johndoe/", "ex3/ex3.html"); + File mockFile1 = new File("v4t-course-test/spring_boot_course_2/exercise_1_1/student_13/", "ex1.html"); + File mockFile2 = new File("v4t-course-test/spring_boot_course_2/exercise_1_1/student_13/", "ex2.html"); + File mockFile3 = new File("v4t-course-test/spring_boot_course_2/exercise_1_1/student_13/", "ex3/ex3.html"); Map> returnMap = new HashMap<>(); returnMap.put(exercise, Arrays.asList(mockFile1, mockFile2, mockFile3)); when(filesService.saveExerciseFiles(anyLong(), any(MultipartFile.class), anyString())).thenReturn(returnMap); @@ -192,7 +192,6 @@ public void uploadFile() throws Exception { verify(filesService, times(1)).saveExerciseFiles(anyLong(), any(MultipartFile.class), anyString()); } - @Test public void uploadFile_noBody() throws Exception { mockMvc.perform(multipart("/api/exercises/1/files").with(csrf()).header("Authorization", @@ -284,12 +283,12 @@ public void getAllStudentFiles() throws Exception { Exercise exercise = new Exercise("Exercise 1"); exercise.setId(1l); List files = new ArrayList<>(); - files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr/ej1.txt")); - files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr/ej2.txt")); - files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr2/ej1.txt")); - files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr2/ej2.txt")); - files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr3/ej1.txt")); - files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr3/ej2.txt")); + files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/student_13/ej1.txt")); + files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/student_13/ej2.txt")); + files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/student_14/ej1.txt")); + files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/student_14/ej2.txt")); + files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/student_15/ej1.txt")); + files.add(new File("v4t-course-test/spring-boot-course/exercise_1_1/student_15/ej2.txt")); for (File file : files) { file.getParentFile().mkdirs(); file.createNewFile(); @@ -308,12 +307,12 @@ public void getAllStudentFiles() throws Exception { .isEqualTo("attachment; filename=\"exercise-1-files.zip\""); byte[] zipContent = result.getResponse().getContentAsByteArray(); ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(zipContent)); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr/ej1.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr/ej2.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr2/ej1.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr2/ej2.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr3/ej1.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr3/ej2.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_13/ej1.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_13/ej2.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_14/ej1.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_14/ej2.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_15/ej1.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_15/ej2.txt"); verify(filesService, times(1)).getAllStudentsFiles(anyLong(), anyString()); } @@ -323,12 +322,12 @@ public void getAllStudentFilesWindows() throws Exception { Exercise exercise = new Exercise("Exercise 1"); exercise.setId(1l); List files = new ArrayList<>(); - files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\johndoejr\\ej1.txt")); - files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\johndoejr\\ej2.txt")); - files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\johndoejr2\\ej1.txt")); - files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\johndoejr2\\ej2.txt")); - files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\johndoejr3\\ej1.txt")); - files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\johndoejr3\\ej2.txt")); + files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\student_13\\ej1.txt")); + files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\student_13\\ej2.txt")); + files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\student_14\\ej1.txt")); + files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\student_14\\ej2.txt")); + files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\student_15\\ej1.txt")); + files.add(new File("v4t-course-test\\spring-boot-course\\exercise_1_1\\student_15\\ej2.txt")); for (File file : files) { file.getParentFile().mkdirs(); file.createNewFile(); @@ -347,12 +346,12 @@ public void getAllStudentFilesWindows() throws Exception { .isEqualTo("attachment; filename=\"exercise-1-files.zip\""); byte[] zipContent = result.getResponse().getContentAsByteArray(); ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(zipContent)); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr/ej1.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr/ej2.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr2/ej1.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr2/ej2.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr3/ej1.txt"); - assertThat(zis.getNextEntry().getName()).isEqualTo("johndoejr3/ej2.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_13/ej1.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_13/ej2.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_14/ej1.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_14/ej2.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_15/ej1.txt"); + assertThat(zis.getNextEntry().getName()).isEqualTo("student_15/ej2.txt"); verify(filesService, times(1)).getAllStudentsFiles(anyLong(), anyString()); } @@ -374,4 +373,4 @@ public void getFileInfo() throws Exception { .writeValueAsString(exFiles); assertThat(expectedResponseBody).isEqualToIgnoringWhitespace(actualResponseBody); } -} \ No newline at end of file +} diff --git a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/JWTLoginControllerTests.java b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/JWTLoginControllerTests.java index c1937e5a..d24ef252 100644 --- a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/JWTLoginControllerTests.java +++ b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/controllertests/JWTLoginControllerTests.java @@ -1,25 +1,5 @@ package com.vscode4teaching.vscode4teachingserver.controllertests; -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - import com.fasterxml.jackson.databind.ObjectMapper; import com.vscode4teaching.vscode4teachingserver.controllers.dtos.JWTRequest; import com.vscode4teaching.vscode4teachingserver.controllers.dtos.UserDTO; @@ -29,9 +9,9 @@ import com.vscode4teaching.vscode4teachingserver.model.views.UserViews; import com.vscode4teaching.vscode4teachingserver.security.jwt.JWTTokenUtil; import com.vscode4teaching.vscode4teachingserver.servicesimpl.JWTUserDetailsService; - import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; +import org.mockito.MockedStatic; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -48,6 +28,22 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + @SpringBootTest @TestPropertySource(locations = "classpath:test.properties") @AutoConfigureMockMvc @@ -83,7 +79,7 @@ public void login() throws Exception { jwtRequest.setPassword("teacherpassword"); mockMvc.perform(post("/api/login").contentType("application/json").with(csrf()) - .content(objectMapper.writeValueAsString(jwtRequest))).andExpect(status().isOk()) + .content(objectMapper.writeValueAsString(jwtRequest))).andExpect(status().isOk()) .andExpect(jsonPath("$.jwtToken", equalTo("mockToken"))); ArgumentCaptor usernameCaptor = ArgumentCaptor.forClass(String.class); @@ -118,7 +114,7 @@ public void register() throws Exception { } @Test - @WithMockUser(roles = { "STUDENT", "TEACHER" }) + @WithMockUser(roles = {"STUDENT", "TEACHER"}) public void registerTeacher() throws Exception { Role studentRole = new Role("ROLE_STUDENT"); studentRole.setId(2l); @@ -131,24 +127,34 @@ public void registerTeacher() throws Exception { UserDTO userDTO = new UserDTO(); userDTO.setEmail("johndoe@gmail.com"); userDTO.setUsername("johndoe"); - userDTO.setPassword("password"); userDTO.setName("John"); userDTO.setLastName("Doe"); when(userService.save(any(com.vscode4teaching.vscode4teachingserver.model.User.class), eq(true))) .thenReturn(expectedUser); - MvcResult mvcResult = mockMvc.perform(post("/api/teachers/register").contentType("application/json") - .with(csrf()).content(objectMapper.writeValueAsString(userDTO))).andExpect(status().isCreated()) - .andReturn(); + UUID randomPassword = UUID.randomUUID(); - String actualResponseBody = mvcResult.getResponse().getContentAsString(); - String expectedResponseBody = objectMapper.writerWithView(UserViews.EmailView.class) - .writeValueAsString(expectedUser); - assertThat(expectedResponseBody).isEqualToIgnoringWhitespace(actualResponseBody); + try (MockedStatic mockedUUID = mockStatic(UUID.class)) { + // UUID random generation is mocked and a prefixed value is returned + mockedUUID.when(UUID::randomUUID).thenReturn(randomPassword); + + MvcResult mvcResult = mockMvc.perform(post("/api/teachers/invitation") + .contentType("application/json") + .with(csrf()).content(objectMapper.writeValueAsString(userDTO))) + .andExpect(status().isCreated()) + .andReturn(); + + // Server is returning the new random password unencrypted in response + userDTO.setPassword(randomPassword.toString()); + + String actualResponseBody = mvcResult.getResponse().getContentAsString(); + String expectedResponseBody = objectMapper.writeValueAsString(userDTO); + assertThat(expectedResponseBody).isEqualToIgnoringWhitespace(actualResponseBody); + } } @Test - @WithMockUser(roles = { "STUDENT", "TEACHER" }) + @WithMockUser(roles = {"STUDENT", "TEACHER"}) public void getCurrentUser() throws Exception { Role studentRole = new Role("ROLE_STUDENT"); @@ -172,4 +178,4 @@ public void getCurrentUser() throws Exception { .writeValueAsString(expectedUser); assertThat(expectedResponseBody).isEqualToIgnoringWhitespace(actualResponseBody); } -} \ No newline at end of file +} diff --git a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/integrationtests/IntegrationTests.java b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/integrationtests/IntegrationTests.java index d7838fce..c3afc486 100644 --- a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/integrationtests/IntegrationTests.java +++ b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/integrationtests/IntegrationTests.java @@ -52,38 +52,4 @@ public void login_into_createCourse() throws Exception { Course actualResponse = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), Course.class); assertThat(actualResponse.getName()).isEqualTo(course.getName()); } - - // Login, try to create course without body (fails with bad request) and token - // doesn't get invalidated on error - @Test - public void expectError() throws Exception { - JWTRequest jwtRequest = new JWTRequest(); - jwtRequest.setUsername("johndoe"); - jwtRequest.setPassword("teacherpassword"); - - MvcResult loginResult = mockMvc.perform(post("/api/login").contentType("application/json").with(csrf()) - .content(objectMapper.writeValueAsString(jwtRequest))).andExpect(status().isOk()).andReturn(); - JWTResponse jwtToken = objectMapper.readValue(loginResult.getResponse().getContentAsString(), - JWTResponse.class); - - MvcResult mvcErrorResult = mockMvc.perform(post("/api/courses").contentType("application/json").with(csrf()) - .header("Authorization", "Bearer " + jwtToken.getJwtToken())).andExpect(status().isBadRequest()) - .andReturn(); - - CourseDTO course = new CourseDTO(); - course.setName("Spring Boot Course"); - - MvcResult mvcCorrectResult = mockMvc - .perform(post("/api/courses").contentType("application/json").with(csrf()) - .content(objectMapper.writeValueAsString(course)) - .header("Authorization", "Bearer " + jwtToken.getJwtToken())) - .andExpect(status().isCreated()).andReturn(); - - String actualErrorResponse = mvcErrorResult.getResponse().getContentAsString(); - assertThat(actualErrorResponse).isEqualTo(""); - Course actualCorrectResponse = objectMapper.readValue(mvcCorrectResult.getResponse().getContentAsString(), - Course.class); - assertThat(actualCorrectResponse.getName()).isEqualTo(course.getName()); - } - } \ No newline at end of file diff --git a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/servicetests/ExerciseFilesServiceImplTests.java b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/servicetests/ExerciseFilesServiceImplTests.java index 1e315caa..8231f13e 100644 --- a/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/servicetests/ExerciseFilesServiceImplTests.java +++ b/vscode4teaching-server/src/test/java/com/vscode4teaching/vscode4teachingserver/servicetests/ExerciseFilesServiceImplTests.java @@ -143,8 +143,8 @@ public void getExerciseFiles_withUserFiles() throws Exception { ExerciseFile file2 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/template/ej2.txt"); exercise.addFileToTemplate(file1); exercise.addFileToTemplate(file2); - ExerciseFile file3 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/johndoe/ej1.txt"); - ExerciseFile file4 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/johndoe/ej2.txt"); + ExerciseFile file3 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/student_12/ej1.txt"); + ExerciseFile file4 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/student_12/ej2.txt"); file3.setOwner(student); file4.setOwner(student); exercise.addUserFile(file3); @@ -159,9 +159,9 @@ public void getExerciseFiles_withUserFiles() throws Exception { logger.info(files.get(1).getAbsolutePath()); assertThat(files.size()).isEqualTo(2); assertThat(files.get(0).getPath().replace("\\", "/")) - .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/johndoe/ej1.txt"); + .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/student_12/ej1.txt"); assertThat(files.get(1).getPath().replace("\\", "/")) - .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/johndoe/ej2.txt"); + .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/student_12/ej2.txt"); verify(exerciseRepository, times(1)).findById(anyLong()); } @@ -201,18 +201,18 @@ private boolean checkPathHasBeenSaved(String path) { return this.pathsSaved.add(path); } - private void fileAsserts() throws IOException { + private void fileAsserts(ExerciseUserInfo eui) throws IOException { assertThat(Files.exists(Paths.get("null/"))).isTrue(); assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/"))).isTrue(); - assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe"))).isTrue(); - assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex1.html"))).isTrue(); - assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex2.html"))).isTrue(); - assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex3/ex3.html"))).isTrue(); - assertThat(Files.readAllLines(Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex1.html"))) + assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId()))).isTrue(); + assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex1.html"))).isTrue(); + assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex2.html"))).isTrue(); + assertThat(Files.exists(Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex3/ex3.html"))).isTrue(); + assertThat(Files.readAllLines(Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex1.html"))) .contains("Exercise 1"); - assertThat(Files.readAllLines(Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex2.html"))) + assertThat(Files.readAllLines(Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex2.html"))) .contains("Exercise 2"); - assertThat(Files.readAllLines(Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex3/ex3.html"))) + assertThat(Files.readAllLines(Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex3/ex3.html"))) .contains("Exercise 3"); } @@ -224,11 +224,11 @@ private void exerciseUserInfoAsserts(ExerciseUserInfo eui) { assertThat(exercise.getUserFiles().get(1).getOwner()).isEqualTo(student); assertThat(exercise.getUserFiles().get(2).getOwner()).isEqualTo(student); assertThat(exercise.getUserFiles().get(0).getPath()).isEqualToIgnoringCase( - Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex1.html").toAbsolutePath().toString()); + Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex1.html").toAbsolutePath().toString()); assertThat(exercise.getUserFiles().get(1).getPath()).isEqualToIgnoringCase( - Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex2.html").toAbsolutePath().toString()); + Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex2.html").toAbsolutePath().toString()); assertThat(exercise.getUserFiles().get(2).getPath()).isEqualToIgnoringCase( - Paths.get("null/spring_boot_course_4/exercise_1_1/johndoe/ex3/ex3.html").toAbsolutePath().toString()); + Paths.get("null/spring_boot_course_4/exercise_1_1/student_" + eui.getId() + "/ex3/ex3.html").toAbsolutePath().toString()); } private ExerciseUserInfo setupSaveExerciseFiles() { @@ -276,7 +276,7 @@ public void saveExerciseFiles() throws Exception { verify(fileRepository, times(3)).save(any(ExerciseFile.class)); verify(exerciseRepository, times(1)).save(any(Exercise.class)); verify(exerciseUserInfoRepository, times(1)).findByExercise_IdAndUser_Username(anyLong(), anyString()); - this.fileAsserts(); + this.fileAsserts(eui); this.exerciseUserInfoAsserts(eui); assertThat(savedFiles.size()).isEqualTo(3); assertThat(savedFiles.get(0).getAbsolutePath()).isEqualToIgnoringCase(exercise.getUserFiles().get(0).getPath()); @@ -299,7 +299,7 @@ public void saveExerciseFilesIgnoreDuplicates() throws Exception { verify(fileRepository, times(3)).save(any(ExerciseFile.class)); verify(exerciseRepository, times(2)).save(any(Exercise.class)); verify(exerciseUserInfoRepository, times(2)).findByExercise_IdAndUser_Username(anyLong(), anyString()); - this.fileAsserts(); + this.fileAsserts(eui); this.exerciseUserInfoAsserts(eui); assertThat(savedFiles.get(0).getAbsolutePath()).isEqualToIgnoringCase(exercise.getUserFiles().get(0).getPath()); assertThat(savedFiles.get(1).getAbsolutePath()).isEqualToIgnoringCase(exercise.getUserFiles().get(1).getPath()); @@ -463,32 +463,32 @@ public void getAllStudentExercises() throws ExerciseNotFoundException, NotInCour ExerciseFile file2 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/template/ej2.txt"); exercise.addFileToTemplate(file1); exercise.addFileToTemplate(file2); - ExerciseFile teacherFile1 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/johndoe/ej1.txt"); - ExerciseFile teacherFile2 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/johndoe/ej2.txt"); + ExerciseFile teacherFile1 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/student_10/ej1.txt"); + ExerciseFile teacherFile2 = new ExerciseFile("v4t-course-test/spring-boot-course/exercise_1_1/student_10/ej2.txt"); teacherFile1.setOwner(teacher); teacherFile2.setOwner(teacher); exercise.addUserFile(teacherFile1); exercise.addUserFile(teacherFile2); ExerciseFile student1File1 = new ExerciseFile( - "v4t-course-test/spring-boot-course/exercise_1_1/johndoejr1/ej1.txt"); + "v4t-course-test/spring-boot-course/exercise_1_1/student_11/ej1.txt"); ExerciseFile student1File2 = new ExerciseFile( - "v4t-course-test/spring-boot-course/exercise_1_1/johndoejr1/ej2.txt"); + "v4t-course-test/spring-boot-course/exercise_1_1/student_11/ej2.txt"); student1File1.setOwner(student1); student1File2.setOwner(student1); exercise.addUserFile(student1File1); exercise.addUserFile(student1File2); ExerciseFile student2File1 = new ExerciseFile( - "v4t-course-test/spring-boot-course/exercise_1_1/johndoejr2/ej1.txt"); + "v4t-course-test/spring-boot-course/exercise_1_1/student_12/ej1.txt"); ExerciseFile student2File2 = new ExerciseFile( - "v4t-course-test/spring-boot-course/exercise_1_1/johndoejr2/ej2.txt"); + "v4t-course-test/spring-boot-course/exercise_1_1/student_12/ej2.txt"); student2File1.setOwner(student2); student2File2.setOwner(student2); exercise.addUserFile(student2File1); exercise.addUserFile(student2File2); ExerciseFile student3File1 = new ExerciseFile( - "v4t-course-test/spring-boot-course/exercise_1_1/johndoejr3/ej1.txt"); + "v4t-course-test/spring-boot-course/exercise_1_1/student_13/ej1.txt"); ExerciseFile student3File2 = new ExerciseFile( - "v4t-course-test/spring-boot-course/exercise_1_1/johndoejr3/ej2.txt"); + "v4t-course-test/spring-boot-course/exercise_1_1/student_13/ej2.txt"); student3File1.setOwner(student3); student3File2.setOwner(student3); exercise.addUserFile(student3File1); @@ -501,17 +501,17 @@ public void getAllStudentExercises() throws ExerciseNotFoundException, NotInCour assertThat(files.size()).isEqualTo(6); assertThat(files.get(0).getPath().replace("\\", "/")) - .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr1/ej1.txt"); + .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/student_11/ej1.txt"); assertThat(files.get(1).getPath().replace("\\", "/")) - .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr1/ej2.txt"); + .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/student_11/ej2.txt"); assertThat(files.get(2).getPath().replace("\\", "/")) - .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr2/ej1.txt"); + .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/student_12/ej1.txt"); assertThat(files.get(3).getPath().replace("\\", "/")) - .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr2/ej2.txt"); + .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/student_12/ej2.txt"); assertThat(files.get(4).getPath().replace("\\", "/")) - .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr3/ej1.txt"); + .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/student_13/ej1.txt"); assertThat(files.get(5).getPath().replace("\\", "/")) - .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/johndoejr3/ej2.txt"); + .isEqualTo("v4t-course-test/spring-boot-course/exercise_1_1/student_13/ej2.txt"); verify(exerciseRepository, times(1)).findById(anyLong()); } @@ -545,13 +545,13 @@ public void getFileIds() throws ExerciseNotFoundException { exercise.setId(1l); course.addExercise(exercise); exercise.setCourse(course); - ExerciseFile ex1 = new ExerciseFile("johndoejr1" + File.separator + "test1"); + ExerciseFile ex1 = new ExerciseFile("student_11" + File.separator + "test1"); ex1.setId(101l); ex1.setOwner(student1); - ExerciseFile ex2 = new ExerciseFile("johndoejr2" + File.separator + "test2"); + ExerciseFile ex2 = new ExerciseFile("student_12" + File.separator + "test2"); ex2.setId(102l); ex2.setOwner(student2); - ExerciseFile ex3 = new ExerciseFile("johndoejr3" + File.separator + "test3"); + ExerciseFile ex3 = new ExerciseFile("student_13" + File.separator + "test3"); ex3.setId(103l); ex3.setOwner(student3); exercise.addUserFile(ex1); diff --git a/vscode4teaching-server/v4t-course/angular_course_9/exercise_1_36/johndoejr2/ej.html b/vscode4teaching-server/v4t-course/angular_course_9/exercise_1_36/student_39/ej.html similarity index 100% rename from vscode4teaching-server/v4t-course/angular_course_9/exercise_1_36/johndoejr2/ej.html rename to vscode4teaching-server/v4t-course/angular_course_9/exercise_1_36/student_39/ej.html diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/.gitignore b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/.gitignore new file mode 100644 index 00000000..2f7896d1 --- /dev/null +++ b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/.mvn/wrapper/maven-wrapper.jar b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/.mvn/wrapper/maven-wrapper.jar rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/.mvn/wrapper/maven-wrapper.jar diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/.mvn/wrapper/maven-wrapper.properties b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/.mvn/wrapper/maven-wrapper.properties rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/.mvn/wrapper/maven-wrapper.properties diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/images/imagePlaceholder.png b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/images/imagePlaceholder.png similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/images/imagePlaceholder.png rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/images/imagePlaceholder.png diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/mvnw b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/mvnw similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/mvnw rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/mvnw diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/mvnw.cmd b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/mvnw.cmd similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/mvnw.cmd rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/mvnw.cmd diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/pom.xml b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/pom.xml similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/pom.xml rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/pom.xml diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/Application.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/Application.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/Application.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/Application.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/DatabaseInfoLoader.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/DatabaseInfoLoader.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/DatabaseInfoLoader.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/DatabaseInfoLoader.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/ChapterController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/ChapterController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/ChapterController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/ChapterController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/ConceptController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/ConceptController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/ConceptController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/ConceptController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/CustomErrorController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/CustomErrorController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/CustomErrorController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/CustomErrorController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/CustomWebMvcConfigurerAdapter.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/CustomWebMvcConfigurerAdapter.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/CustomWebMvcConfigurerAdapter.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/CustomWebMvcConfigurerAdapter.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/ImageController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/ImageController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/ImageController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/ImageController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/StudentController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/StudentController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/StudentController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/StudentController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/TeacherController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/TeacherController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/controllers/TeacherController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/controllers/TeacherController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Answer.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Answer.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Answer.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Answer.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Chapter.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Chapter.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Chapter.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Chapter.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Concept.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Concept.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Concept.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Concept.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Justification.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Justification.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Justification.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Justification.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Question.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Question.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/Question.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/Question.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/User.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/User.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/model/User.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/model/User.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/AnswerRepository.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/AnswerRepository.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/AnswerRepository.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/AnswerRepository.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/ChapterRepository.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/ChapterRepository.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/ChapterRepository.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/ChapterRepository.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/ConceptRepository.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/ConceptRepository.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/ConceptRepository.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/ConceptRepository.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/JustificationRepository.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/JustificationRepository.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/JustificationRepository.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/JustificationRepository.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/QuestionRepository.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/QuestionRepository.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/QuestionRepository.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/QuestionRepository.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/UserRepository.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/UserRepository.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/repositories/UserRepository.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/repositories/UserRepository.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/DiagramRestController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/DiagramRestController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/DiagramRestController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/DiagramRestController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/RestChapterController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/RestChapterController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/RestChapterController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/RestChapterController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/RestConceptControllerStudent.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/RestConceptControllerStudent.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/RestConceptControllerStudent.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/RestConceptControllerStudent.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/RestConceptControllerTeacher.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/RestConceptControllerTeacher.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/RestConceptControllerTeacher.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/RestConceptControllerTeacher.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/RestImageController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/RestImageController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/RestImageController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/RestImageController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/UserRestController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/UserRestController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/restcontrollers/UserRestController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/restcontrollers/UserRestController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/CSRFHandlerConfiguration.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/CSRFHandlerConfiguration.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/CSRFHandlerConfiguration.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/CSRFHandlerConfiguration.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/LoginController.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/LoginController.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/LoginController.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/LoginController.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/RestControllerExceptionHandler.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/RestControllerExceptionHandler.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/RestControllerExceptionHandler.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/RestControllerExceptionHandler.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/RestSecurityConfig.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/RestSecurityConfig.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/RestSecurityConfig.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/RestSecurityConfig.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/UserRepositoryAuthenticationProvider.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/UserRepositoryAuthenticationProvider.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/UserRepositoryAuthenticationProvider.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/UserRepositoryAuthenticationProvider.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/WebSecurityConfig.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/WebSecurityConfig.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/security/WebSecurityConfig.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/security/WebSecurityConfig.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/AnswerService.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/AnswerService.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/AnswerService.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/AnswerService.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/ChapterService.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/ChapterService.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/ChapterService.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/ChapterService.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/ConceptService.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/ConceptService.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/ConceptService.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/ConceptService.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/DiagramChapterInfo.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/DiagramChapterInfo.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/DiagramChapterInfo.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/DiagramChapterInfo.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/ImageService.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/ImageService.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/ImageService.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/ImageService.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/JustificationService.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/JustificationService.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/JustificationService.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/JustificationService.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/QuestionService.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/QuestionService.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/QuestionService.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/QuestionService.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/UserService.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/UserService.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/services/UserService.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/services/UserService.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/usersession/Tab.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/usersession/Tab.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/usersession/Tab.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/usersession/Tab.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/usersession/UserSessionInfoComponent.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/usersession/UserSessionInfoComponent.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/usersession/UserSessionInfoComponent.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/usersession/UserSessionInfoComponent.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/usersession/UserSessionService.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/usersession/UserSessionService.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/usersession/UserSessionService.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/usersession/UserSessionService.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/utilities/JacksonAdapter.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/utilities/JacksonAdapter.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/utilities/JacksonAdapter.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/utilities/JacksonAdapter.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/utilities/QuestionGenerator.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/utilities/QuestionGenerator.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/utilities/QuestionGenerator.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/utilities/QuestionGenerator.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/utilities/QuestionMarker.java b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/utilities/QuestionMarker.java similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/java/com/group5/definitions/utilities/QuestionMarker.java rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/java/com/group5/definitions/utilities/QuestionMarker.java diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/application.properties b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/application.properties similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/application.properties rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/application.properties diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/keystore.jks b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/keystore.jks similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/keystore.jks rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/keystore.jks diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/.DS_Store b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/.DS_Store similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/.DS_Store rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/.DS_Store diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/.DS_Store b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/.DS_Store similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/.DS_Store rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/.DS_Store diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/main.css b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/main.css similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/main.css rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/main.css diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/material-dashboard-rtl.css b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/material-dashboard-rtl.css similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/material-dashboard-rtl.css rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/material-dashboard-rtl.css diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/material-dashboard.css b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/material-dashboard.css similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/material-dashboard.css rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/material-dashboard.css diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/material-dashboard.css.map b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/material-dashboard.css.map similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/material-dashboard.css.map rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/material-dashboard.css.map diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/material-dashboard.min.css b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/material-dashboard.min.css similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/material-dashboard.min.css rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/material-dashboard.min.css diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/modalstyle.css b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/modalstyle.css similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/modalstyle.css rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/modalstyle.css diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/searchbar.css b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/searchbar.css similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/css/searchbar.css rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/css/searchbar.css diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/gifs/ajax-loader.gif b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/gifs/ajax-loader.gif similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/gifs/ajax-loader.gif rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/gifs/ajax-loader.gif diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/.DS_Store b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/.DS_Store similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/.DS_Store rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/.DS_Store diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/confirmation.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/confirmation.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/confirmation.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/confirmation.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/core/bootstrap-material-design.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/core/bootstrap-material-design.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/core/bootstrap-material-design.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/core/bootstrap-material-design.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/core/jquery.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/core/jquery.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/core/jquery.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/core/jquery.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/core/popper.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/core/popper.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/core/popper.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/core/popper.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/diagramgenerator.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/diagramgenerator.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/diagramgenerator.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/diagramgenerator.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadAnswers.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadAnswers.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadAnswers.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadAnswers.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadChapter.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadChapter.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadChapter.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadChapter.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadConcepts.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadConcepts.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadConcepts.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadConcepts.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadQuestions.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadQuestions.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadQuestions.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadQuestions.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadUnmarkedJustifications.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadUnmarkedJustifications.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadFunctions/loadUnmarkedJustifications.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadFunctions/loadUnmarkedJustifications.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadcontent.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadcontent.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/loadcontent.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/loadcontent.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/material-dashboard.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/material-dashboard.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/material-dashboard.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/material-dashboard.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/material-dashboard.js.map b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/material-dashboard.js.map similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/material-dashboard.js.map rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/material-dashboard.js.map diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/material-dashboard.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/material-dashboard.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/material-dashboard.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/material-dashboard.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/arrive.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/arrive.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/arrive.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/arrive.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/bootstrap-datetimepicker.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/bootstrap-datetimepicker.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/bootstrap-datetimepicker.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/bootstrap-datetimepicker.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/bootstrap-notify.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/bootstrap-notify.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/bootstrap-notify.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/bootstrap-notify.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/bootstrap-selectpicker.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/bootstrap-selectpicker.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/bootstrap-selectpicker.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/bootstrap-selectpicker.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/bootstrap-tagsinput.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/bootstrap-tagsinput.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/bootstrap-tagsinput.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/bootstrap-tagsinput.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/chartist.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/chartist.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/chartist.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/chartist.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/echarts.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/echarts.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/echarts.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/echarts.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/fullcalendar.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/fullcalendar.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/fullcalendar.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/fullcalendar.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jasny-bootstrap.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jasny-bootstrap.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jasny-bootstrap.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jasny-bootstrap.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery-jvectormap.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery-jvectormap.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery-jvectormap.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery-jvectormap.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery.bootstrap-wizard.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery.bootstrap-wizard.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery.bootstrap-wizard.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery.bootstrap-wizard.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery.dataTables.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery.dataTables.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery.dataTables.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery.dataTables.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery.tagsinput.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery.tagsinput.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery.tagsinput.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery.tagsinput.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery.validate.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery.validate.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/jquery.validate.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/jquery.validate.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/moment.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/moment.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/moment.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/moment.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/nouislider.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/nouislider.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/nouislider.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/nouislider.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/perfect-scrollbar.jquery.min.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/perfect-scrollbar.jquery.min.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/perfect-scrollbar.jquery.min.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/perfect-scrollbar.jquery.min.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/sweetalert2.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/sweetalert2.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/plugins/sweetalert2.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/plugins/sweetalert2.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/showHideTeacher.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/showHideTeacher.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/showHideTeacher.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/showHideTeacher.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/tab-close-prevent-default.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/tab-close-prevent-default.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/tab-close-prevent-default.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/tab-close-prevent-default.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/validatePass.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/validatePass.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/js/validatePass.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/js/validatePass.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_alerts.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_alerts.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_alerts.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_alerts.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_buttons.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_buttons.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_buttons.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_buttons.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_cards.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_cards.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_cards.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_cards.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_checkboxes.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_checkboxes.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_checkboxes.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_checkboxes.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_core-bootstrap.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_core-bootstrap.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_core-bootstrap.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_core-bootstrap.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_dropdown.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_dropdown.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_dropdown.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_dropdown.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_example-pages.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_example-pages.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_example-pages.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_example-pages.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_fixed-plugin.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_fixed-plugin.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_fixed-plugin.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_fixed-plugin.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_footers.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_footers.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_footers.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_footers.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_forms.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_forms.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_forms.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_forms.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_headers.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_headers.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_headers.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_headers.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_images.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_images.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_images.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_images.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_info-areas.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_info-areas.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_info-areas.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_info-areas.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_input-group.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_input-group.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_input-group.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_input-group.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_misc.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_misc.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_misc.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_misc.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_mixins.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_mixins.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_mixins.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_mixins.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_navbar.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_navbar.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_navbar.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_navbar.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_popover.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_popover.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_popover.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_popover.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_popups.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_popups.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_popups.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_popups.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_radios.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_radios.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_radios.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_radios.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_responsive.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_responsive.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_responsive.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_responsive.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_ripples.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_ripples.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_ripples.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_ripples.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_sidebar-and-main-panel.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_sidebar-and-main-panel.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_sidebar-and-main-panel.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_sidebar-and-main-panel.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_social-buttons.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_social-buttons.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_social-buttons.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_social-buttons.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_tables.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_tables.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_tables.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_tables.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_tabs.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_tabs.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_tabs.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_tabs.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_togglebutton.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_togglebutton.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_togglebutton.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_togglebutton.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_tooltip.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_tooltip.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_tooltip.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_tooltip.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_type.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_type.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_type.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_type.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_variables.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_variables.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/_variables.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/_variables.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_alert.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_alert.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_alert.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_alert.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_badge.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_badge.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_badge.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_badge.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_breadcrumb.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_breadcrumb.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_breadcrumb.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_breadcrumb.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_button-group.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_button-group.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_button-group.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_button-group.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_buttons.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_buttons.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_buttons.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_buttons.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_card.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_card.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_card.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_card.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_carousel.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_carousel.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_carousel.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_carousel.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_close.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_close.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_close.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_close.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_code.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_code.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_code.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_code.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_custom-forms.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_custom-forms.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_custom-forms.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_custom-forms.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_dropdown.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_dropdown.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_dropdown.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_dropdown.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_forms.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_forms.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_forms.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_forms.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_functions.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_functions.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_functions.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_functions.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_grid.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_grid.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_grid.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_grid.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_images.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_images.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_images.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_images.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_input-group.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_input-group.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_input-group.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_input-group.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_jumbotron.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_jumbotron.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_jumbotron.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_jumbotron.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_list-group.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_list-group.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_list-group.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_list-group.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_media.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_media.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_media.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_media.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_mixins.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_mixins.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_mixins.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_mixins.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_modal.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_modal.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_modal.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_modal.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_nav.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_nav.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_nav.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_nav.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_navbar.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_navbar.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_navbar.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_navbar.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_pagination.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_pagination.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_pagination.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_pagination.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_popover.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_popover.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_popover.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_popover.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_print.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_print.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_print.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_print.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_progress.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_progress.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_progress.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_progress.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_reboot.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_reboot.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_reboot.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_reboot.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_root.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_root.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_root.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_root.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_tables.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_tables.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_tables.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_tables.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_tooltip.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_tooltip.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_tooltip.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_tooltip.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_transitions.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_transitions.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_transitions.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_transitions.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_type.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_type.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_type.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_type.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_utilities.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_utilities.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_utilities.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_utilities.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_variables.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_variables.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_variables.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/_variables.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap-grid.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap-grid.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap-grid.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap-grid.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap-reboot.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap-reboot.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap-reboot.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap-reboot.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/bootstrap.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_alert.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_alert.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_alert.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_alert.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_background-variant.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_background-variant.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_background-variant.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_background-variant.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_badge.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_badge.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_badge.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_badge.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_border-radius.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_border-radius.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_border-radius.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_border-radius.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_box-shadow.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_box-shadow.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_box-shadow.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_box-shadow.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_breakpoints.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_breakpoints.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_breakpoints.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_breakpoints.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_buttons.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_buttons.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_buttons.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_buttons.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_caret.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_caret.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_caret.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_caret.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_clearfix.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_clearfix.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_clearfix.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_clearfix.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_float.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_float.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_float.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_float.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_forms.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_forms.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_forms.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_forms.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_gradients.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_gradients.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_gradients.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_gradients.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_grid-framework.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_grid-framework.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_grid-framework.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_grid-framework.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_grid.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_grid.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_grid.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_grid.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_hover.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_hover.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_hover.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_hover.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_image.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_image.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_image.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_image.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_list-group.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_list-group.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_list-group.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_list-group.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_lists.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_lists.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_lists.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_lists.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_nav-divider.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_nav-divider.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_nav-divider.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_nav-divider.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_navbar-align.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_navbar-align.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_navbar-align.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_navbar-align.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_pagination.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_pagination.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_pagination.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_pagination.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_reset-text.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_reset-text.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_reset-text.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_reset-text.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_resize.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_resize.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_resize.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_resize.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_screen-reader.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_screen-reader.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_screen-reader.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_screen-reader.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_size.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_size.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_size.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_size.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_table-row.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_table-row.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_table-row.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_table-row.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-emphasis.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-emphasis.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-emphasis.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-emphasis.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-hide.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-hide.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-hide.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-hide.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-truncate.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-truncate.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-truncate.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_text-truncate.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_transition.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_transition.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_transition.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_transition.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_visibility.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_visibility.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_visibility.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/mixins/_visibility.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_align.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_align.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_align.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_align.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_background.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_background.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_background.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_background.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_borders.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_borders.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_borders.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_borders.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_clearfix.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_clearfix.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_clearfix.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_clearfix.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_display.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_display.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_display.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_display.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_embed.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_embed.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_embed.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_embed.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_flex.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_flex.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_flex.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_flex.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_float.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_float.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_float.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_float.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_position.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_position.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_position.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_position.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_screenreaders.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_screenreaders.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_screenreaders.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_screenreaders.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_sizing.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_sizing.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_sizing.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_sizing.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_spacing.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_spacing.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_spacing.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_spacing.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_text.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_text.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_text.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_text.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_visibility.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_visibility.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_visibility.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/bootstrap/scss/utilities/_visibility.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/cards/_card-plain.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/cards/_card-plain.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/cards/_card-plain.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/cards/_card-plain.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/cards/_card-profile.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/cards/_card-profile.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/cards/_card-profile.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/cards/_card-profile.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/cards/_card-stats.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/cards/_card-stats.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/cards/_card-stats.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/cards/_card-stats.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_alert.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_alert.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_alert.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_alert.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_animations.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_animations.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_animations.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_animations.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_breakpoints.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_breakpoints.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_breakpoints.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_breakpoints.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_buttons.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_buttons.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_buttons.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_buttons.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_chartist.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_chartist.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_chartist.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_chartist.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_colored-shadows.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_colored-shadows.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_colored-shadows.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_colored-shadows.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_drawer.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_drawer.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_drawer.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_drawer.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_forms.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_forms.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_forms.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_forms.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_hover.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_hover.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_hover.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_hover.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_layout.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_layout.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_layout.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_layout.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_navbar-colors.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_navbar-colors.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_navbar-colors.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_navbar-colors.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_navs.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_navs.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_navs.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_navs.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_sidebar-color.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_sidebar-color.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_sidebar-color.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_sidebar-color.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_transparency.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_transparency.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_transparency.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_transparency.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_type.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_type.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_type.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_type.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_utilities.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_utilities.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_utilities.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_utilities.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_variables.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_variables.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_variables.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_variables.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_vendor-prefixes.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_vendor-prefixes.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/mixins/_vendor-prefixes.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/mixins/_vendor-prefixes.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/plugins/_animate.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/plugins/_animate.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/plugins/_animate.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/plugins/_animate.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/plugins/_chartist.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/plugins/_chartist.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/plugins/_chartist.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/plugins/_chartist.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/plugins/_perfect-scrollbar.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/plugins/_perfect-scrollbar.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/plugins/_perfect-scrollbar.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/plugins/_perfect-scrollbar.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_body.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_body.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_body.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_body.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_bootstrap-material-design-base.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_bootstrap-material-design-base.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_bootstrap-material-design-base.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_bootstrap-material-design-base.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_bootstrap-material-design.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_bootstrap-material-design.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_bootstrap-material-design.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_bootstrap-material-design.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_brand.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_brand.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_brand.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_brand.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_buttons.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_buttons.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_buttons.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_buttons.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_card.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_card.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_card.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_card.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_code.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_code.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_code.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_code.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_colors-map.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_colors-map.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_colors-map.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_colors-map.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_colors.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_colors.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_colors.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_colors.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_custom-forms.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_custom-forms.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_custom-forms.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_custom-forms.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_drawer.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_drawer.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_drawer.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_drawer.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_dropdown.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_dropdown.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_dropdown.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_dropdown.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_forms.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_forms.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_forms.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_forms.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_layout.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_layout.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_layout.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_layout.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_list-group.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_list-group.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_list-group.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_list-group.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_menu.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_menu.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_menu.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_menu.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_modals.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_modals.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_modals.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_modals.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_nav.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_nav.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_nav.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_nav.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_pagination.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_pagination.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_pagination.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_pagination.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_shadow.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_shadow.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_shadow.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_shadow.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_snackbar.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_snackbar.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_snackbar.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_snackbar.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_spacing.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_spacing.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_spacing.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_spacing.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_state.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_state.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_state.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_state.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_tables.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_tables.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_tables.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_tables.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_tooltip.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_tooltip.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_tooltip.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_tooltip.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_type.scss b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_type.scss similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/assets/scss/material-dashboard/variables/_type.scss rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/assets/scss/material-dashboard/variables/_type.scss diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/MaterialIcons-Regular.eot b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/MaterialIcons-Regular.eot similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/MaterialIcons-Regular.eot rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/MaterialIcons-Regular.eot diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/MaterialIcons-Regular.ttf b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/MaterialIcons-Regular.ttf similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/MaterialIcons-Regular.ttf rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/MaterialIcons-Regular.ttf diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/MaterialIcons-Regular.woff b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/MaterialIcons-Regular.woff similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/MaterialIcons-Regular.woff rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/MaterialIcons-Regular.woff diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/MaterialIcons-Regular.woff2 b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/MaterialIcons-Regular.woff2 similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/MaterialIcons-Regular.woff2 rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/MaterialIcons-Regular.woff2 diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/es2015-polyfills.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/es2015-polyfills.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/es2015-polyfills.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/es2015-polyfills.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/es2015-polyfills.js.map b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/es2015-polyfills.js.map similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/es2015-polyfills.js.map rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/es2015-polyfills.js.map diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/favicon.ico b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/favicon.ico similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/favicon.ico rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/favicon.ico diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/index.html b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/index.html similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/index.html rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/index.html diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/main.36d76efcf1bcf5f3dea0.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/main.36d76efcf1bcf5f3dea0.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/main.36d76efcf1bcf5f3dea0.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/main.36d76efcf1bcf5f3dea0.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/main.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/main.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/main.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/main.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/main.js.map b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/main.js.map similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/main.js.map rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/main.js.map diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/polyfills.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/polyfills.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/polyfills.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/polyfills.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/polyfills.js.map b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/polyfills.js.map similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/polyfills.js.map rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/polyfills.js.map diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/runtime.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/runtime.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/runtime.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/runtime.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/runtime.js.map b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/runtime.js.map similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/runtime.js.map rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/runtime.js.map diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/styles.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/styles.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/styles.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/styles.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/styles.js.map b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/styles.js.map similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/styles.js.map rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/styles.js.map diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/vendor.js b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/vendor.js similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/vendor.js rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/vendor.js diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/vendor.js.map b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/vendor.js.map similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/static/new/vendor.js.map rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/static/new/vendor.js.map diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/chapterInfo.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/chapterInfo.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/chapterInfo.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/chapterInfo.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/concept.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/concept.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/concept.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/concept.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/conceptInfo.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/conceptInfo.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/conceptInfo.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/conceptInfo.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/diagram.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/diagram.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/diagram.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/diagram.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/error.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/error.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/error.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/error.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/footer.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/footer.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/footer.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/footer.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/header.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/header.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/header.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/header.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/home.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/home.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/home.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/home.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/loginPage.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/loginPage.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/loginPage.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/loginPage.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/register.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/register.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/register.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/register.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showJustificationsUnmarked.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showJustificationsUnmarked.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showJustificationsUnmarked.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showJustificationsUnmarked.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showQuestionTeacherMarked.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showQuestionTeacherMarked.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showQuestionTeacherMarked.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showQuestionTeacherMarked.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showQuestionTeacherUnmarked.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showQuestionTeacherUnmarked.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showQuestionTeacherUnmarked.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showQuestionTeacherUnmarked.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showanswer.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showanswer.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showanswer.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showanswer.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showjustification.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showjustification.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showjustification.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showjustification.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showquestion.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showquestion.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/showquestion.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/showquestion.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/teacher.mustache b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/teacher.mustache similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr/src/main/resources/templates/old/teacher.mustache rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_13/src/main/resources/templates/old/teacher.mustache diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr2/ej.html b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_14/ej.html similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr2/ej.html rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_14/ej.html diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr3/ej.html b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_15/ej.html similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/johndoejr3/ej.html rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_1_11/student_15/ej.html diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_5_31/johndoe/ej.html b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_5_31/student_32/ej.html similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_5_31/johndoe/ej.html rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_5_31/student_32/ej.html diff --git a/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_5_31/johndoe/ej2.html b/vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_5_31/student_32/ej2.html similarity index 100% rename from vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_5_31/johndoe/ej2.html rename to vscode4teaching-server/v4t-course/spring_boot_course_8/exercise_5_31/student_32/ej2.html diff --git a/vscode4teaching-webapp/.browserslistrc b/vscode4teaching-webapp/.browserslistrc new file mode 100644 index 00000000..4f9ac269 --- /dev/null +++ b/vscode4teaching-webapp/.browserslistrc @@ -0,0 +1,16 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR diff --git a/vscode4teaching-webapp/.gitignore b/vscode4teaching-webapp/.gitignore new file mode 100644 index 00000000..557d98ff --- /dev/null +++ b/vscode4teaching-webapp/.gitignore @@ -0,0 +1,43 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/vscode4teaching-webapp/angular.json b/vscode4teaching-webapp/angular.json new file mode 100644 index 00000000..8ab4e3ed --- /dev/null +++ b/vscode4teaching-webapp/angular.json @@ -0,0 +1,116 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "vscode4teaching-webapp": { + "projectType": "application", + "schematics": { + "@schematics/angular:application": { + "strict": true + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "node_modules/bootstrap/dist/css/bootstrap.css", + "node_modules/@fortawesome/fontawesome-free/css/all.css", + "src/styles.css" + ], + "scripts": [ + "node_modules/bootstrap/dist/js/bootstrap.js" + ] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "1mb", + "maximumError": "2mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "vscode4teaching-webapp:build:production", + "proxyConfig": "src/proxy.conf.json" + }, + "development": { + "browserTarget": "vscode4teaching-webapp:build:development", + "proxyConfig": "src/proxy.conf.json" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "vscode4teaching-webapp:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "node_modules/bootstrap/dist/css/bootstrap.css", + "node_modules/@fortawesome/fontawesome-free/css/all.css", + "src/styles.css" + ], + "scripts": [ + "node_modules/bootstrap/dist/js/bootstrap.js" + ] + } + } + } + } + }, + "defaultProject": "vscode4teaching-webapp" +} diff --git a/vscode4teaching-webapp/karma.conf.js b/vscode4teaching-webapp/karma.conf.js new file mode 100644 index 00000000..f789085a --- /dev/null +++ b/vscode4teaching-webapp/karma.conf.js @@ -0,0 +1,50 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/vscode4teaching-webapp'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['ChromeHeadlessCI'], + customLaunchers: { + ChromeHeadlessCI: { + base: 'ChromeHeadless', + flags: ['--no-sandbox'] + } + }, + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/vscode4teaching-webapp/package-lock.json b/vscode4teaching-webapp/package-lock.json new file mode 100644 index 00000000..9c5676cf --- /dev/null +++ b/vscode4teaching-webapp/package-lock.json @@ -0,0 +1,19440 @@ +{ + "name": "vscode4teaching-webapp", + "version": "2.1.1-beta", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "vscode4teaching-webapp", + "version": "2.1.1-beta", + "dependencies": { + "@angular/animations": "~13.2.2", + "@angular/common": "~13.2.2", + "@angular/compiler": "~13.2.2", + "@angular/core": "~13.2.2", + "@angular/forms": "~13.2.2", + "@angular/platform-browser": "~13.2.2", + "@angular/platform-browser-dynamic": "~13.2.2", + "@angular/router": "~13.2.2", + "@fortawesome/fontawesome-free": "^5.15.4", + "bootstrap": "5.1.3", + "rxjs": "~7.4.0", + "tslib": "^2.3.0", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~13.2.3", + "@angular/cli": "~13.2.3", + "@angular/compiler-cli": "~13.2.2", + "@types/jasmine": "~3.10.0", + "@types/node": "^12.11.1", + "jasmine-core": "~3.10.0", + "karma": "^6.3.16", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.1.0", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "~1.7.0", + "typescript": "^4.5.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", + "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "sourcemap-codec": "1.4.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1302.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.3.tgz", + "integrity": "sha512-0m8jMKrFfIqsYt33zTUwSmyekyfuS67hna08RQ6USjzWQSE3z4S8ulCUARSjM6AzdMblX+whfy56nJUpT17NSA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.2.3", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.3.tgz", + "integrity": "sha512-cZ2gRcMRgW3t1WCeP+2D/wmr2M+BR/RICAh0wL9irIdypWAzIFt3Z2+2R/HmgAAxoEkdUMIfB9AnkYmwRVgFeA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "1.1.1", + "@angular-devkit/architect": "0.1302.3", + "@angular-devkit/build-webpack": "0.1302.3", + "@angular-devkit/core": "13.2.3", + "@babel/core": "7.16.12", + "@babel/generator": "7.16.8", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.16.10", + "@babel/preset-env": "7.16.11", + "@babel/runtime": "7.16.7", + "@babel/template": "7.16.7", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.2.3", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.9.1", + "cacache": "15.3.0", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "10.2.1", + "core-js": "3.20.3", + "critters": "0.0.16", + "css-loader": "6.5.1", + "esbuild-wasm": "0.14.14", + "glob": "7.2.0", + "https-proxy-agent": "5.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.1", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.5.3", + "minimatch": "3.0.4", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.2.0", + "postcss": "8.4.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.2.1", + "postcss-preset-env": "7.2.3", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.49.0", + "sass-loader": "12.4.0", + "semver": "7.3.5", + "source-map-loader": "3.0.1", + "source-map-support": "0.5.21", + "stylus": "0.56.0", + "stylus-loader": "6.2.0", + "terser": "5.10.0", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.1", + "webpack": "5.67.0", + "webpack-dev-middleware": "5.3.0", + "webpack-dev-server": "4.7.3", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.14.14" + }, + "peerDependencies": { + "@angular/compiler-cli": "^13.0.0", + "@angular/localize": "^13.0.0", + "@angular/service-worker": "^13.0.0", + "karma": "^6.3.0", + "ng-packagr": "^13.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.4.3 <4.6" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1302.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.3.tgz", + "integrity": "sha512-+JYH1lWU0UOjaWYxpoR2VLsdcb6nG9Gv+M1gH+kT0r2sAKOFaHnrksbOvca3EhDoaMa2b9LSGEE0OcSHWnN+eQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1302.3", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/core": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.3.tgz", + "integrity": "sha512-/47RA8qmWzeS60xSdaprIn1MiSv0Iw83t0M9/ENH7irFS5vMAq62NCcwiWXH59pZmvvLbF+7xy/RgYUZLr4nHQ==", + "dev": true, + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.3.tgz", + "integrity": "sha512-+dyC4iKV0huvpjiuz4uyjLNK3FsCIp/Ghv5lXvhG6yok/dCAubsJItJOxi6G16aVCzG/E9zbsDfm9fNMyVOkgQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.2.3", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular/animations": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.2.tgz", + "integrity": "sha512-qX8LAMuCJaueHBVyuwKtqunx96G0Dr26k7y5Z03VTcscYst4Ib4V2d4i5dwn3HS82DehFdO86cm3Hi2PqE/qww==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "13.2.2" + } + }, + "node_modules/@angular/cli": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.3.tgz", + "integrity": "sha512-QsakxpdQuO67u4fQNuOASqabYUO9gJb/5CpUGpWbuBzru0/9CMEF1CtXoF4EoDiwa5sJMirz3SJMKhtzFlv1cQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@angular-devkit/architect": "0.1302.3", + "@angular-devkit/core": "13.2.3", + "@angular-devkit/schematics": "13.2.3", + "@schematics/angular": "13.2.3", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.3", + "ini": "2.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "12.0.3", + "resolve": "1.22.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.2.tgz", + "integrity": "sha512-56C/bheNLKtTCyQUZCiYtKbBIZN9jj6rjFILPtJCGls3cBCxp7t9tIdoLiQG/wVQRmaxdj1ioLT+sCWz7mLtQw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "13.2.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.2.tgz", + "integrity": "sha512-XXQtB0/e7pR2LPrHmpEiTU72SX4xxHGy91vYWIj1JCjSn0fYF7vtHzSJPXDvkbnkNow/PXXzJJYaU1ctdMZPcA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.2.tgz", + "integrity": "sha512-tuOIcEEKVIht+mKrj0rtX3I8gc+ByPjzpCZhFQRggxM6xbKJIToO1zERbEGKrZ+sUJ6BB5KLvscDy+Pddy3b8w==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.6", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/main-ngcc.js" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/compiler": "13.2.2", + "typescript": ">=4.4.2 <4.6" + } + }, + "node_modules/@angular/core": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.2.tgz", + "integrity": "sha512-zpctw0BxIVOsRFnckchK15SD1L8tzhf5GzwIDaM6+VylDQj1uYkm8mvAjJTQZyUuApomoFet2Rfj7XQPV+cNSQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4" + } + }, + "node_modules/@angular/forms": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.2.tgz", + "integrity": "sha512-T61W4Ay9X9qhxjc6lLqpNFeHrGKwg2mqdsZ3zIm/c7oKo37mgl9TB5kkrtnS+205r3N2hF4ICnGFZ4a/egUP/g==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.2.2", + "@angular/core": "13.2.2", + "@angular/platform-browser": "13.2.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.2.tgz", + "integrity": "sha512-M7gWC8fFCPc/CRcHCzqe/j7WzwAUMeKt9vwlK633XnesHBoqZdYgbb3YHHc6WPVU0YI09Nb/Hm5sezEKmjUmPg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/animations": "13.2.2", + "@angular/common": "13.2.2", + "@angular/core": "13.2.2" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.2.tgz", + "integrity": "sha512-lj6xwat0StLp+ROFqXU62upwHQhlxaQi0djhrS+DGKUK0Xu9bkBeaSCfBFgS78jPm1SwL8Xztu9/vuDAHLRrqw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.2.2", + "@angular/compiler": "13.2.2", + "@angular/core": "13.2.2", + "@angular/platform-browser": "13.2.2" + } + }, + "node_modules/@angular/router": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.2.tgz", + "integrity": "sha512-dt2b9/kGJAkmOqUmUD3aKlp4pGpdqLwB0zmhUYF3ktNEcQaPf4ZjWT/4jhy09gFL+TKOHG5OQW9GxBbhWI4bSg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.2.2", + "@angular/core": "13.2.2", + "@angular/platform-browser": "13.2.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz", + "integrity": "sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "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" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", + "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", + "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@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.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz", + "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.0", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz", + "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.1.0.tgz", + "integrity": "sha512-DO76V3295AqhjJZvgeaDP5GAGAat4g6wYfF8X+1n+76MpJat8ffY5bCJ9eSUqFY71nImxXgaDTRYJcRnA9oo7g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.3.tgz", + "integrity": "sha512-wooUZiV92QyoeFxkhqIwH/cfiAAAn+l8fEEuaaEIfJtpjpbShvvlboEVsqb28soeGiFJfLcmsZM3mUFgsG4QBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^13.0.0", + "typescript": ">=4.4.3 <4.6", + "webpack": "^5.30.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true + }, + "node_modules/@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "dependencies": { + "infer-owner": "^1.0.4" + } + }, + "node_modules/@npmcli/run-script": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", + "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@schematics/angular": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.3.tgz", + "integrity": "sha512-jloooGC7eco9AKxlIMMqFRptJYzZ0jNRBStWOp2dCISg6rmOKqpxbsHLtYFQIT1PnlomSxtKDAgYGQMDi9zhXw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.2.3", + "@angular-devkit/schematics": "13.2.3", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", + "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.10.3.tgz", + "integrity": "sha512-SWyMrjgdAUHNQmutvDcKablrJhkDLy4wunTme8oYLjKp41GnHGxMRXr2MQMvy/qy8H3LdzwQk9gH4hZ6T++H8g==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.42.tgz", + "integrity": "sha512-aI3/oo5DzyiI5R/xAhxxRzfZlWlsbbqdgxfTPkqu/Zt+23GXiJvMCyPJT4+xKSXOnLqoL8jJYMLTwvK2M3a5hw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "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" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "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" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "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" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "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" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz", + "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "dev": true, + "dependencies": { + "bytes": "3.1.1", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "@popperjs/core": "^2.10.2" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001300", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", + "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "dependencies": { + "is-what": "^3.12.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", + "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js": { + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.0.tgz", + "integrity": "sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A==", + "dev": true, + "dependencies": { + "browserslist": "^4.19.1", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.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", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssdb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "node_modules/date-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.47", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.47.tgz", + "integrity": "sha512-ZHc8i3/cgeCRK/vC7W2htAG6JqUmOUgDNn/f9yY9J8UjfLjwzwOVEt4MWmgJAdvmxyrsR5KIFA/6+kUHGY0eUA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.1.tgz", + "integrity": "sha512-AyMc20q8JUUdvKd46+thc9o7yCZ6iC6MoBCChG5Z1XmFMpp+2+y/oKvwpZTUJB0KCjxScw1dV9c2h5pjiYBLuQ==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dev": true, + "dependencies": { + "@socket.io/base64-arraybuffer": "~1.0.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.14.tgz", + "integrity": "sha512-aiK4ddv+uui0k52OqSHu4xxu+SzOim7Rlz4i25pMEiC8rlnGU0HJ9r+ZMfdWL5bzifg+nhnn7x4NSWTeehYblg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.14.14", + "esbuild-darwin-64": "0.14.14", + "esbuild-darwin-arm64": "0.14.14", + "esbuild-freebsd-64": "0.14.14", + "esbuild-freebsd-arm64": "0.14.14", + "esbuild-linux-32": "0.14.14", + "esbuild-linux-64": "0.14.14", + "esbuild-linux-arm": "0.14.14", + "esbuild-linux-arm64": "0.14.14", + "esbuild-linux-mips64le": "0.14.14", + "esbuild-linux-ppc64le": "0.14.14", + "esbuild-linux-s390x": "0.14.14", + "esbuild-netbsd-64": "0.14.14", + "esbuild-openbsd-64": "0.14.14", + "esbuild-sunos-64": "0.14.14", + "esbuild-windows-32": "0.14.14", + "esbuild-windows-64": "0.14.14", + "esbuild-windows-arm64": "0.14.14" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.14.tgz", + "integrity": "sha512-be/Uw6DdpQiPfula1J4bdmA+wtZ6T3BRCZsDMFB5X+k0Gp8TIh9UvmAcqvKNnbRAafSaXG3jPCeXxDKqnc8hFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.14.tgz", + "integrity": "sha512-BEexYmjWafcISK8cT6O98E3TfcLuZL8DKuubry6G54n2+bD4GkoRD6HYUOnCkfl2p7jodA+s4369IjSFSWjtHg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.14.tgz", + "integrity": "sha512-tnBKm41pDOB1GtZ8q/w26gZlLLRzVmP8fdsduYjvM+yFD7E2DLG4KbPAqFMWm4Md9B+DitBglP57FY7AznxbTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.14.tgz", + "integrity": "sha512-Q9Rx6sgArOHalQtNwAaIzJ6dnQ8A+I7f/RsQsdkS3JrdzmnlFo8JEVofTmwVQLoIop7OKUqIVOGP4PoQcwfVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.14.tgz", + "integrity": "sha512-TJvq0OpLM7BkTczlyPIphcvnwrQwQDG1HqxzoYePWn26SMUAlt6wrLnEvxdbXAvNvDLVzG83kA+JimjK7aRNBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.14.tgz", + "integrity": "sha512-h/CrK9Baimt5VRbu8gqibWV7e1P9l+mkanQgyOgv0Ng3jHT1NVFC9e6rb1zbDdaJVmuhWX5xVliUA5bDDCcJeg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.14.tgz", + "integrity": "sha512-IC+wAiIg/egp5OhQp4W44D9PcBOH1b621iRn1OXmlLzij9a/6BGr9NMIL4CRwz4j2kp3WNZu5sT473tYdynOuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.14.tgz", + "integrity": "sha512-gxpOaHOPwp7zSmcKYsHrtxabScMqaTzfSQioAMUaB047YiMuDBzqVcKBG8OuESrYkGrL9DDljXr/mQNg7pbdaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.14.tgz", + "integrity": "sha512-6QVul3RI4M5/VxVIRF/I5F+7BaxzR3DfNGoqEVSCZqUbgzHExPn+LXr5ly1C7af2Kw4AHpo+wDqx8A4ziP9avw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.14.tgz", + "integrity": "sha512-4Jl5/+xoINKbA4cesH3f4R+q0vltAztZ6Jm8YycS8lNhN1pgZJBDxWfI6HUMIAdkKlIpR1PIkA9aXQgZ8sxFAg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.14.tgz", + "integrity": "sha512-BitW37GxeebKxqYNl4SVuSdnIJAzH830Lr6Mkq3pBHXtzQay0vK+IeOR/Ele1GtNVJ+/f8wYM53tcThkv5SC5w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.14.tgz", + "integrity": "sha512-vLj6p76HOZG3wfuTr5MyO3qW5iu8YdhUNxuY+tx846rPo7GcKtYSPMusQjeVEfZlJpSYoR+yrNBBxq+qVF9zrw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.14.tgz", + "integrity": "sha512-fn8looXPQhpVqUyCBWUuPjesH+yGIyfbIQrLKG05rr1Kgm3rZD/gaYrd3Wpmf5syVZx70pKZPvdHp8OTA+y7cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ] + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.14.tgz", + "integrity": "sha512-HdAnJ399pPff3SKbd8g+P4o5znseni5u5n5rJ6Z7ouqOdgbOwHe2ofZbMow17WMdNtz1IyOZk2Wo9Ve6/lZ4Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.14.tgz", + "integrity": "sha512-bmDHa99ulsGnYlh/xjBEfxoGuC8CEG5OWvlgD+pF7bKKiVTbtxqVCvOGEZeoDXB+ja6AvHIbPxrEE32J+m5nqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ] + }, + "node_modules/esbuild-wasm": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.14.tgz", + "integrity": "sha512-qTjK4MWnYtQHCMGg2qDUqeFYXfVvYq5qJkQTIsOV4VZCknoYePVaDTG9ygEB9Ct0kc0DWs7IrS6Ja+GjY62Kzw==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.14.tgz", + "integrity": "sha512-6tVooQcxJCNenPp5GHZBs/RLu31q4B+BuF4MEoRxswT+Eq2JGF0ZWDRQwNKB8QVIo3t6Svc5wNGez+CwKNQjBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.14.tgz", + "integrity": "sha512-kl3BdPXh0/RD/dad41dtzj2itMUR4C6nQbXQCyYHHo4zoUoeIXhpCrSl7BAW1nv5EFL8stT1V+TQVXGZca5A2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.14.tgz", + "integrity": "sha512-dCm1wTOm6HIisLanmybvRKvaXZZo4yEVrHh1dY0v582GThXJOzuXGja1HIQgV09RpSHYRL3m4KoUBL00l6SWEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.1", + "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.7", + "qs": "6.9.6", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", + "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", + "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", + "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.10.1.tgz", + "integrity": "sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", + "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==", + "dev": true, + "dependencies": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-coverage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.1.0.tgz", + "integrity": "sha512-uIejpnArNFQIovB6EPsKO/T4XofELdJWXcA2ADXztFlKhHbr0Ws6ba7wKTMVWsIhEs4iJxdhQkCQrkkhFJSZCw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/karma-jasmine": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "dev": true, + "dependencies": { + "jasmine-core": "^3.6.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "karma": "*" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": ">=3.8", + "karma": ">=0.9", + "karma-jasmine": ">=1.1" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/less": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-SQum9mg3BgnY5BK+2KYl4W7pk9b26Q8tW2lTsO6tidD0/Ds9ksdXvp3ip2s9LqDjj5gtBMyWRfOPZptWj4PfCg==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "dev": true, + "dependencies": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "dev": true, + "dependencies": { + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-forge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "node_modules/npm-registry-fetch": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz", + "integrity": "sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^10.0.1", + "minipass": "^3.1.6", + "minipass-fetch": "^1.4.1", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^8.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.3.1.tgz", + "integrity": "sha512-nX1x4qUrKqwbIAhv4s9et4FIUVzNOpeY07bsjGUy8gwJrXH/wScImSQqXErmo/b2jZY2r0mohbLA9zVj7u1cNw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.2.tgz", + "integrity": "sha512-JSFLK53NJP22FL/eAGOyKsWbc2G3v+toPMD7Dq9PJKQCvK0i3t8hGkKxe+3YZzwYa+c0kxRHu7uxH3fvO+rsaA==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.0", + "cacache": "^15.3.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.3.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.4.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^8.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm-registry-fetch/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dev": true, + "dependencies": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz", + "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==", + "dev": true, + "dependencies": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^3.0.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^12.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dev": true, + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "dev": true, + "dependencies": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.2" + }, + "peerDependencies": { + "postcss": "^8.0.2" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.4.tgz", + "integrity": "sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.2" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.5.tgz", + "integrity": "sha512-XiZzvdxLOWZwtt/1GgHJYGoD9scog/DD/yI5dcvPrXNdNDEv7T53/6tL7ikl+EM3jcerII5/XIQzd1UHOdTi2w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.5.tgz", + "integrity": "sha512-gPUJc71ji9XKyl0WSzAalBeEA/89kU+XpffpPxSaaaZ1c48OL36r1Ep5R6+9XAPkIiDlSvVAwP4io12q/vTcvA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.0.tgz", + "integrity": "sha512-59uHN/2wRaOd7whDyeaJ82E0kncIEeJkwcmvXFPNus8v1YMhtv2IUo9OtOAncn7sifZVMRsyoPlhxwckTjn4cQ==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", + "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.8" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", + "dev": true, + "dependencies": { + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz", + "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "optional": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "dev": true, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "dev": true, + "dependencies": { + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", + "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", + "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "dev": true, + "dependencies": { + "node-forge": "^1.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", + "dev": true, + "dependencies": { + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylus": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz", + "integrity": "sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA==", + "dev": true, + "dependencies": { + "css": "^3.0.0", + "debug": "^4.3.2", + "glob": "^7.1.6", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "klona": "^2.0.4", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "stylus": ">=0.52.4", + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "acorn": "^8.5.0" + }, + "peerDependenciesMeta": { + "acorn": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "dev": true, + "dependencies": { + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.8.tgz", + "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.67.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", + "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "dev": true, + "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.9", + "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.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "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": "^2.0.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.0", + "ws": "^8.1.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "dependencies": { + "tslib": "^2.0.0" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", + "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "sourcemap-codec": "1.4.8" + } + }, + "@angular-devkit/architect": { + "version": "0.1302.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.3.tgz", + "integrity": "sha512-0m8jMKrFfIqsYt33zTUwSmyekyfuS67hna08RQ6USjzWQSE3z4S8ulCUARSjM6AzdMblX+whfy56nJUpT17NSA==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.2.3", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/build-angular": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.3.tgz", + "integrity": "sha512-cZ2gRcMRgW3t1WCeP+2D/wmr2M+BR/RICAh0wL9irIdypWAzIFt3Z2+2R/HmgAAxoEkdUMIfB9AnkYmwRVgFeA==", + "dev": true, + "requires": { + "@ampproject/remapping": "1.1.1", + "@angular-devkit/architect": "0.1302.3", + "@angular-devkit/build-webpack": "0.1302.3", + "@angular-devkit/core": "13.2.3", + "@babel/core": "7.16.12", + "@babel/generator": "7.16.8", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.16.10", + "@babel/preset-env": "7.16.11", + "@babel/runtime": "7.16.7", + "@babel/template": "7.16.7", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.2.3", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.9.1", + "cacache": "15.3.0", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "10.2.1", + "core-js": "3.20.3", + "critters": "0.0.16", + "css-loader": "6.5.1", + "esbuild": "0.14.14", + "esbuild-wasm": "0.14.14", + "glob": "7.2.0", + "https-proxy-agent": "5.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.1", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.5.3", + "minimatch": "3.0.4", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.2.0", + "postcss": "8.4.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.2.1", + "postcss-preset-env": "7.2.3", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.49.0", + "sass-loader": "12.4.0", + "semver": "7.3.5", + "source-map-loader": "3.0.1", + "source-map-support": "0.5.21", + "stylus": "0.56.0", + "stylus-loader": "6.2.0", + "terser": "5.10.0", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.1", + "webpack": "5.67.0", + "webpack-dev-middleware": "5.3.0", + "webpack-dev-server": "4.7.3", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1302.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.3.tgz", + "integrity": "sha512-+JYH1lWU0UOjaWYxpoR2VLsdcb6nG9Gv+M1gH+kT0r2sAKOFaHnrksbOvca3EhDoaMa2b9LSGEE0OcSHWnN+eQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1302.3", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.3.tgz", + "integrity": "sha512-/47RA8qmWzeS60xSdaprIn1MiSv0Iw83t0M9/ENH7irFS5vMAq62NCcwiWXH59pZmvvLbF+7xy/RgYUZLr4nHQ==", + "dev": true, + "requires": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.3.tgz", + "integrity": "sha512-+dyC4iKV0huvpjiuz4uyjLNK3FsCIp/Ghv5lXvhG6yok/dCAubsJItJOxi6G16aVCzG/E9zbsDfm9fNMyVOkgQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.2.3", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular/animations": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.2.tgz", + "integrity": "sha512-qX8LAMuCJaueHBVyuwKtqunx96G0Dr26k7y5Z03VTcscYst4Ib4V2d4i5dwn3HS82DehFdO86cm3Hi2PqE/qww==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/cli": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.3.tgz", + "integrity": "sha512-QsakxpdQuO67u4fQNuOASqabYUO9gJb/5CpUGpWbuBzru0/9CMEF1CtXoF4EoDiwa5sJMirz3SJMKhtzFlv1cQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1302.3", + "@angular-devkit/core": "13.2.3", + "@angular-devkit/schematics": "13.2.3", + "@schematics/angular": "13.2.3", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.3", + "ini": "2.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "12.0.3", + "resolve": "1.22.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + } + }, + "@angular/common": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.2.tgz", + "integrity": "sha512-56C/bheNLKtTCyQUZCiYtKbBIZN9jj6rjFILPtJCGls3cBCxp7t9tIdoLiQG/wVQRmaxdj1ioLT+sCWz7mLtQw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.2.tgz", + "integrity": "sha512-XXQtB0/e7pR2LPrHmpEiTU72SX4xxHGy91vYWIj1JCjSn0fYF7vtHzSJPXDvkbnkNow/PXXzJJYaU1ctdMZPcA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler-cli": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.2.tgz", + "integrity": "sha512-tuOIcEEKVIht+mKrj0rtX3I8gc+ByPjzpCZhFQRggxM6xbKJIToO1zERbEGKrZ+sUJ6BB5KLvscDy+Pddy3b8w==", + "dev": true, + "requires": { + "@babel/core": "^7.8.6", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + } + }, + "@angular/core": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.2.tgz", + "integrity": "sha512-zpctw0BxIVOsRFnckchK15SD1L8tzhf5GzwIDaM6+VylDQj1uYkm8mvAjJTQZyUuApomoFet2Rfj7XQPV+cNSQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/forms": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.2.tgz", + "integrity": "sha512-T61W4Ay9X9qhxjc6lLqpNFeHrGKwg2mqdsZ3zIm/c7oKo37mgl9TB5kkrtnS+205r3N2hF4ICnGFZ4a/egUP/g==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.2.tgz", + "integrity": "sha512-M7gWC8fFCPc/CRcHCzqe/j7WzwAUMeKt9vwlK633XnesHBoqZdYgbb3YHHc6WPVU0YI09Nb/Hm5sezEKmjUmPg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.2.tgz", + "integrity": "sha512-lj6xwat0StLp+ROFqXU62upwHQhlxaQi0djhrS+DGKUK0Xu9bkBeaSCfBFgS78jPm1SwL8Xztu9/vuDAHLRrqw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/router": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.2.tgz", + "integrity": "sha512-dt2b9/kGJAkmOqUmUD3aKlp4pGpdqLwB0zmhUYF3ktNEcQaPf4ZjWT/4jhy09gFL+TKOHG5OQW9GxBbhWI4bSg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz", + "integrity": "sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + } + }, + "@babel/helpers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", + "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", + "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/preset-env": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@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.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@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/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz", + "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.0", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz", + "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.1.0.tgz", + "integrity": "sha512-DO76V3295AqhjJZvgeaDP5GAGAat4g6wYfF8X+1n+76MpJat8ffY5bCJ9eSUqFY71nImxXgaDTRYJcRnA9oo7g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true + }, + "@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" + }, + "@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@ngtools/webpack": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.3.tgz", + "integrity": "sha512-wooUZiV92QyoeFxkhqIwH/cfiAAAn+l8fEEuaaEIfJtpjpbShvvlboEVsqb28soeGiFJfLcmsZM3mUFgsG4QBQ==", + "dev": true, + "requires": {} + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", + "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "@popperjs/core": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "peer": true + }, + "@schematics/angular": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.3.tgz", + "integrity": "sha512-jloooGC7eco9AKxlIMMqFRptJYzZ0jNRBStWOp2dCISg6rmOKqpxbsHLtYFQIT1PnlomSxtKDAgYGQMDi9zhXw==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.2.3", + "@angular-devkit/schematics": "13.2.3", + "jsonc-parser": "3.0.0" + } + }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/eslint": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", + "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.10.3.tgz", + "integrity": "sha512-SWyMrjgdAUHNQmutvDcKablrJhkDLy4wunTme8oYLjKp41GnHGxMRXr2MQMvy/qy8H3LdzwQk9gH4hZ6T++H8g==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/node": { + "version": "12.20.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.42.tgz", + "integrity": "sha512-aI3/oo5DzyiI5R/xAhxxRzfZlWlsbbqdgxfTPkqu/Zt+23GXiJvMCyPJT4+xKSXOnLqoL8jJYMLTwvK2M3a5hw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz", + "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dev": true, + "requires": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "dev": true, + "requires": { + "bytes": "3.1.1", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "requires": {} + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001300", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", + "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true, + "requires": {} + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "requires": { + "is-what": "^3.12.0" + } + }, + "copy-webpack-plugin": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", + "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "core-js": { + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "dev": true + }, + "core-js-compat": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.0.tgz", + "integrity": "sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A==", + "dev": true, + "requires": { + "browserslist": "^4.19.1", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@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" + } + }, + "critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-loader": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "dev": true, + "requires": { + "icss-utils": "^5.1.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", + "semver": "^7.3.5" + } + }, + "css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, + "requires": {} + }, + "css-select": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, + "cssdb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "date-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "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" + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.47", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.47.tgz", + "integrity": "sha512-ZHc8i3/cgeCRK/vC7W2htAG6JqUmOUgDNn/f9yY9J8UjfLjwzwOVEt4MWmgJAdvmxyrsR5KIFA/6+kUHGY0eUA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "engine.io": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.1.tgz", + "integrity": "sha512-AyMc20q8JUUdvKd46+thc9o7yCZ6iC6MoBCChG5Z1XmFMpp+2+y/oKvwpZTUJB0KCjxScw1dV9c2h5pjiYBLuQ==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" + } + }, + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dev": true, + "requires": { + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "esbuild": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.14.tgz", + "integrity": "sha512-aiK4ddv+uui0k52OqSHu4xxu+SzOim7Rlz4i25pMEiC8rlnGU0HJ9r+ZMfdWL5bzifg+nhnn7x4NSWTeehYblg==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-arm64": "0.14.14", + "esbuild-darwin-64": "0.14.14", + "esbuild-darwin-arm64": "0.14.14", + "esbuild-freebsd-64": "0.14.14", + "esbuild-freebsd-arm64": "0.14.14", + "esbuild-linux-32": "0.14.14", + "esbuild-linux-64": "0.14.14", + "esbuild-linux-arm": "0.14.14", + "esbuild-linux-arm64": "0.14.14", + "esbuild-linux-mips64le": "0.14.14", + "esbuild-linux-ppc64le": "0.14.14", + "esbuild-linux-s390x": "0.14.14", + "esbuild-netbsd-64": "0.14.14", + "esbuild-openbsd-64": "0.14.14", + "esbuild-sunos-64": "0.14.14", + "esbuild-windows-32": "0.14.14", + "esbuild-windows-64": "0.14.14", + "esbuild-windows-arm64": "0.14.14" + } + }, + "esbuild-android-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.14.tgz", + "integrity": "sha512-be/Uw6DdpQiPfula1J4bdmA+wtZ6T3BRCZsDMFB5X+k0Gp8TIh9UvmAcqvKNnbRAafSaXG3jPCeXxDKqnc8hFQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.14.tgz", + "integrity": "sha512-BEexYmjWafcISK8cT6O98E3TfcLuZL8DKuubry6G54n2+bD4GkoRD6HYUOnCkfl2p7jodA+s4369IjSFSWjtHg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.14.tgz", + "integrity": "sha512-tnBKm41pDOB1GtZ8q/w26gZlLLRzVmP8fdsduYjvM+yFD7E2DLG4KbPAqFMWm4Md9B+DitBglP57FY7AznxbTg==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.14.tgz", + "integrity": "sha512-Q9Rx6sgArOHalQtNwAaIzJ6dnQ8A+I7f/RsQsdkS3JrdzmnlFo8JEVofTmwVQLoIop7OKUqIVOGP4PoQcwfVMA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.14.tgz", + "integrity": "sha512-TJvq0OpLM7BkTczlyPIphcvnwrQwQDG1HqxzoYePWn26SMUAlt6wrLnEvxdbXAvNvDLVzG83kA+JimjK7aRNBA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.14.tgz", + "integrity": "sha512-h/CrK9Baimt5VRbu8gqibWV7e1P9l+mkanQgyOgv0Ng3jHT1NVFC9e6rb1zbDdaJVmuhWX5xVliUA5bDDCcJeg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.14.tgz", + "integrity": "sha512-IC+wAiIg/egp5OhQp4W44D9PcBOH1b621iRn1OXmlLzij9a/6BGr9NMIL4CRwz4j2kp3WNZu5sT473tYdynOuQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.14.tgz", + "integrity": "sha512-gxpOaHOPwp7zSmcKYsHrtxabScMqaTzfSQioAMUaB047YiMuDBzqVcKBG8OuESrYkGrL9DDljXr/mQNg7pbdaQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.14.tgz", + "integrity": "sha512-6QVul3RI4M5/VxVIRF/I5F+7BaxzR3DfNGoqEVSCZqUbgzHExPn+LXr5ly1C7af2Kw4AHpo+wDqx8A4ziP9avw==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.14.tgz", + "integrity": "sha512-4Jl5/+xoINKbA4cesH3f4R+q0vltAztZ6Jm8YycS8lNhN1pgZJBDxWfI6HUMIAdkKlIpR1PIkA9aXQgZ8sxFAg==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.14.tgz", + "integrity": "sha512-BitW37GxeebKxqYNl4SVuSdnIJAzH830Lr6Mkq3pBHXtzQay0vK+IeOR/Ele1GtNVJ+/f8wYM53tcThkv5SC5w==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.14.tgz", + "integrity": "sha512-vLj6p76HOZG3wfuTr5MyO3qW5iu8YdhUNxuY+tx846rPo7GcKtYSPMusQjeVEfZlJpSYoR+yrNBBxq+qVF9zrw==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.14.tgz", + "integrity": "sha512-fn8looXPQhpVqUyCBWUuPjesH+yGIyfbIQrLKG05rr1Kgm3rZD/gaYrd3Wpmf5syVZx70pKZPvdHp8OTA+y7cQ==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.14.tgz", + "integrity": "sha512-HdAnJ399pPff3SKbd8g+P4o5znseni5u5n5rJ6Z7ouqOdgbOwHe2ofZbMow17WMdNtz1IyOZk2Wo9Ve6/lZ4Rg==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.14.tgz", + "integrity": "sha512-bmDHa99ulsGnYlh/xjBEfxoGuC8CEG5OWvlgD+pF7bKKiVTbtxqVCvOGEZeoDXB+ja6AvHIbPxrEE32J+m5nqQ==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.14.tgz", + "integrity": "sha512-qTjK4MWnYtQHCMGg2qDUqeFYXfVvYq5qJkQTIsOV4VZCknoYePVaDTG9ygEB9Ct0kc0DWs7IrS6Ja+GjY62Kzw==", + "dev": true + }, + "esbuild-windows-32": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.14.tgz", + "integrity": "sha512-6tVooQcxJCNenPp5GHZBs/RLu31q4B+BuF4MEoRxswT+Eq2JGF0ZWDRQwNKB8QVIo3t6Svc5wNGez+CwKNQjBg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.14.tgz", + "integrity": "sha512-kl3BdPXh0/RD/dad41dtzj2itMUR4C6nQbXQCyYHHo4zoUoeIXhpCrSl7BAW1nv5EFL8stT1V+TQVXGZca5A2A==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.14.tgz", + "integrity": "sha512-dCm1wTOm6HIisLanmybvRKvaXZZo4yEVrHh1dY0v582GThXJOzuXGja1HIQgV09RpSHYRL3m4KoUBL00l6SWEg==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "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": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.1", + "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.7", + "qs": "6.9.6", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@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": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", + "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", + "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "requires": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", + "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "ignore-walk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "inquirer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jasmine-core": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.10.1.tgz", + "integrity": "sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA==", + "dev": true + }, + "jest-worker": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "karma": { + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", + "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.1.0.tgz", + "integrity": "sha512-uIejpnArNFQIovB6EPsKO/T4XofELdJWXcA2ADXztFlKhHbr0Ws6ba7wKTMVWsIhEs4iJxdhQkCQrkkhFJSZCw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "karma-jasmine": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "dev": true, + "requires": { + "jasmine-core": "^3.6.0" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "requires": {} + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, + "less": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "license-webpack-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-SQum9mg3BgnY5BK+2KYl4W7pk9b26Q8tW2lTsO6tidD0/Ds9ksdXvp3ip2s9LqDjj5gtBMyWRfOPZptWj4PfCg==", + "dev": true, + "requires": { + "webpack-sources": "^3.0.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "dev": true, + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nanoid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "dev": true + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node-forge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "dev": true + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "dev": true, + "optional": true + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "npm-registry-fetch": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz", + "integrity": "sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.1", + "minipass": "^3.1.6", + "minipass-fetch": "^1.4.1", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^8.1.5" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.3.1.tgz", + "integrity": "sha512-nX1x4qUrKqwbIAhv4s9et4FIUVzNOpeY07bsjGUy8gwJrXH/wScImSQqXErmo/b2jZY2r0mohbLA9zVj7u1cNw==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.2.tgz", + "integrity": "sha512-JSFLK53NJP22FL/eAGOyKsWbc2G3v+toPMD7Dq9PJKQCvK0i3t8hGkKxe+3YZzwYa+c0kxRHu7uxH3fvO+rsaA==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.0", + "cacache": "^15.3.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.3.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.4.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^8.0.1" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dev": true, + "requires": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pacote": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz", + "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==", + "dev": true, + "requires": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^3.0.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^12.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@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-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "requires": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dev": true, + "requires": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "dev": true, + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "dev": true, + "requires": {} + }, + "postcss-custom-properties": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.4.tgz", + "integrity": "sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-double-position-gradients": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.5.tgz", + "integrity": "sha512-XiZzvdxLOWZwtt/1GgHJYGoD9scog/DD/yI5dcvPrXNdNDEv7T53/6tL7ikl+EM3jcerII5/XIQzd1UHOdTi2w==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.5.tgz", + "integrity": "sha512-gPUJc71ji9XKyl0WSzAalBeEA/89kU+XpffpPxSaaaZ1c48OL36r1Ep5R6+9XAPkIiDlSvVAwP4io12q/vTcvA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "requires": {} + }, + "postcss-gap-properties": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "dev": true, + "requires": {} + }, + "postcss-image-set-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "requires": {} + }, + "postcss-lab-function": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.0.tgz", + "integrity": "sha512-59uHN/2wRaOd7whDyeaJ82E0kncIEeJkwcmvXFPNus8v1YMhtv2IUo9OtOAncn7sifZVMRsyoPlhxwckTjn4cQ==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "requires": {} + }, + "postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "requires": {} + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nesting": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", + "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.8" + } + }, + "postcss-overflow-shorthand": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "dev": true, + "requires": {} + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "requires": {} + }, + "postcss-place": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", + "dev": true, + "requires": { + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz", + "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "requires": {} + }, + "postcss-selector-not": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "optional": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "dev": true, + "requires": { + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "requires": { + "tslib": "~2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", + "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "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-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", + "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "dev": true, + "requires": { + "node-forge": "^1.2.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true + }, + "source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "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" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "streamroller": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", + "dev": true, + "requires": { + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "stylus": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz", + "integrity": "sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA==", + "dev": true, + "requires": { + "css": "^3.0.0", + "debug": "^4.3.2", + "glob": "^7.1.6", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "source-map": "^0.7.3" + } + }, + "stylus-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "klona": "^2.0.4", + "normalize-path": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "dev": true, + "requires": { + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "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-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-assert": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.8.tgz", + "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", + "dev": true + }, + "typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "5.67.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", + "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "dev": true, + "requires": { + "@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.9", + "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.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "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-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "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": "^2.0.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.0", + "ws": "^8.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "requires": { + "typed-assert": "^1.0.8" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "requires": {} + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true + }, + "zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "requires": { + "tslib": "^2.0.0" + } + } + } +} diff --git a/vscode4teaching-webapp/package.json b/vscode4teaching-webapp/package.json new file mode 100644 index 00000000..680f4923 --- /dev/null +++ b/vscode4teaching-webapp/package.json @@ -0,0 +1,41 @@ +{ + "name": "vscode4teaching-webapp", + "version": "2.1.1-beta", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build --base-href=\"/app\"", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@angular/animations": "~13.2.2", + "@angular/common": "~13.2.2", + "@angular/compiler": "~13.2.2", + "@angular/core": "~13.2.2", + "@angular/forms": "~13.2.2", + "@angular/platform-browser": "~13.2.2", + "@angular/platform-browser-dynamic": "~13.2.2", + "@angular/router": "~13.2.2", + "@fortawesome/fontawesome-free": "^5.15.4", + "bootstrap": "5.1.3", + "rxjs": "~7.4.0", + "tslib": "^2.3.0", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~13.2.3", + "@angular/cli": "~13.2.3", + "@angular/compiler-cli": "~13.2.2", + "@types/jasmine": "~3.10.0", + "@types/node": "^12.11.1", + "jasmine-core": "~3.10.0", + "karma": "^6.3.16", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.1.0", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "~1.7.0", + "typescript": "^4.5.5" + } +} diff --git a/vscode4teaching-webapp/src/app/app-routing.module.ts b/vscode4teaching-webapp/src/app/app-routing.module.ts new file mode 100644 index 00000000..2024a14a --- /dev/null +++ b/vscode4teaching-webapp/src/app/app-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; +import { TeacherSignUpFormComponent } from "./components/teacher-sign-up-form/teacher-sign-up-form.component"; +import { ErrorNotFoundComponent } from "./components/error-not-found/error-not-found.component"; +import { IndexComponent } from "./components/index/index.component"; + +const routes: Routes = [ + { path: "", component: IndexComponent }, + { path: "teacher/sign-up/:tempPassword", component: TeacherSignUpFormComponent }, + { path: "**", component: ErrorNotFoundComponent }, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], +}) +export class AppRoutingModule {} diff --git a/vscode4teaching-webapp/src/app/app.component.css b/vscode4teaching-webapp/src/app/app.component.css new file mode 100644 index 00000000..e69de29b diff --git a/vscode4teaching-webapp/src/app/app.component.html b/vscode4teaching-webapp/src/app/app.component.html new file mode 100644 index 00000000..bb8adb33 --- /dev/null +++ b/vscode4teaching-webapp/src/app/app.component.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/vscode4teaching-webapp/src/app/app.component.spec.ts b/vscode4teaching-webapp/src/app/app.component.spec.ts new file mode 100644 index 00000000..416aed20 --- /dev/null +++ b/vscode4teaching-webapp/src/app/app.component.spec.ts @@ -0,0 +1,28 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'vscode4teaching-webapp'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('vscode4teaching-webapp'); + }); +}); diff --git a/vscode4teaching-webapp/src/app/app.component.ts b/vscode4teaching-webapp/src/app/app.component.ts new file mode 100644 index 00000000..6fc7c77e --- /dev/null +++ b/vscode4teaching-webapp/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: "app-root", + templateUrl: "./app.component.html", + styleUrls: ["./app.component.css"], +}) +export class AppComponent { + title = "vscode4teaching-webapp"; +} diff --git a/vscode4teaching-webapp/src/app/app.module.ts b/vscode4teaching-webapp/src/app/app.module.ts new file mode 100644 index 00000000..de2d7f9b --- /dev/null +++ b/vscode4teaching-webapp/src/app/app.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from "@angular/core"; +import { ReactiveFormsModule } from "@angular/forms"; +import { BrowserModule } from "@angular/platform-browser"; +import { HttpClientModule, HttpClientXsrfModule, HTTP_INTERCEPTORS } from "@angular/common/http"; + +import { AppRoutingModule } from "./app-routing.module"; +import { AppComponent } from "./app.component"; +import { TeacherSignUpFormComponent } from "./components/teacher-sign-up-form/teacher-sign-up-form.component"; +import { AuthTokenService } from "./services/auth/auth-token.service"; +import { AuthInterceptor } from "./services/auth/auth.interceptor"; +import { IndexComponent } from "./components/index/index.component"; +import { ErrorNotFoundComponent } from "./components/error-not-found/error-not-found.component"; + +@NgModule({ + declarations: [AppComponent, TeacherSignUpFormComponent, IndexComponent, ErrorNotFoundComponent], + imports: [BrowserModule, ReactiveFormsModule, AppRoutingModule, HttpClientModule, HttpClientXsrfModule], + providers: [AuthTokenService, { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }, { provide: Window, useValue: window }], + bootstrap: [AppComponent], +}) +export class AppModule {} diff --git a/vscode4teaching-webapp/src/app/components/error-not-found/error-not-found.component.css b/vscode4teaching-webapp/src/app/components/error-not-found/error-not-found.component.css new file mode 100644 index 00000000..e69de29b diff --git a/vscode4teaching-webapp/src/app/components/error-not-found/error-not-found.component.html b/vscode4teaching-webapp/src/app/components/error-not-found/error-not-found.component.html new file mode 100644 index 00000000..56072c32 --- /dev/null +++ b/vscode4teaching-webapp/src/app/components/error-not-found/error-not-found.component.html @@ -0,0 +1,6 @@ +
+
+

Error 404

+

The page you're looking for could not be found.

+
+
\ No newline at end of file diff --git a/vscode4teaching-webapp/src/app/components/error-not-found/error-not-found.component.ts b/vscode4teaching-webapp/src/app/components/error-not-found/error-not-found.component.ts new file mode 100644 index 00000000..cb26b212 --- /dev/null +++ b/vscode4teaching-webapp/src/app/components/error-not-found/error-not-found.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-error-not-found', + templateUrl: './error-not-found.component.html', + styleUrls: ['./error-not-found.component.css'] +}) +export class ErrorNotFoundComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/vscode4teaching-webapp/src/app/components/index/index.component.css b/vscode4teaching-webapp/src/app/components/index/index.component.css new file mode 100644 index 00000000..9a3cb03c --- /dev/null +++ b/vscode4teaching-webapp/src/app/components/index/index.component.css @@ -0,0 +1,132 @@ +@font-face { + font-family: louis-george-cafe; + src: url("/assets/fonts/Louis George Cafe.ttf"); +} + +@font-face { + font-family: moon-get-heavy; + src: url("/assets/fonts/moon_get-Heavy.otf"); +} + +@font-face { + font-family: Comfortaa; + src: url("/assets/fonts/Comfortaa-Light.ttf"); +} + +header { + background-color: white; + display: flex; + align-items: center; + justify-content: center; + margin: 20px; + height: 100px; +} + +header > img.logo { + height: 100%; +} + +section { + text-align: center; +} + +section > h1.title { + text-align: center; + font-family: moon-get-heavy, serif; +} + +.text-body { + margin: 1rem; + font-size: 1.25rem; + text-align: center; + font-family: louis-george-cafe, serif; +} + +.demo-gif { + width: 100%; + max-width: 1200px; +} + +.downloadBtn { + display: inline-flex; + align-items: center; + justify-content: space-between; + text-transform: uppercase; + border-radius: 20px; + padding: 12px 40px; + font-family: Comfortaa, serif; + font-size: 20px; + transition: all 0.5s; +} + +.downloadBtn#vsc { + border: 2px solid #007acc; + background-color: #ceebff; +} + +.downloadBtn#v4t { + border: 2px solid #f88a81; + background-color: #fbb7b1; +} + +.downloadBtn:hover { + transition: all 0.5s; +} + +.downloadBtn#vsc:hover { + background-color: #9ad6ff; + box-shadow: 0px 0px 20px #9ad6ff; +} + +.downloadBtn#v4t:hover { + background-color: #fbb7b1; + box-shadow: 0px 0px 20px #fbb7b1; +} + +.downloadBtn > img { + width: 30px; + margin-right: 16px; +} + +.downloadBtn > span { + color: black; + font-weight: bold; +} + +.downloadBtn:link, +.downloadBtn:visited { + text-decoration: none; +} + +h3 { + font-family: louis-george-cafe, serif; + margin: 1.5rem 0 0.75rem; +} + +.codeBlock { + display: flex; + width: 40%; + margin: 0 auto 0.5rem auto; +} + +#givenCodeInput { + border: 2px solid #f44a3e; + padding: 12px 40px; + flex-grow: 9; + transition: all 0.25s; +} + +#givenCodeInput:focus { + outline: none; + box-shadow: 0px 0px 20px #f38078; + transition: all 0.25s; +} + +#codeCopyBtn { + background-color: #f44a3e; + padding: 12px 40px; + color: white; + border: 0; + flex-grow: 1; + cursor: pointer; +} diff --git a/vscode4teaching-webapp/src/app/components/index/index.component.html b/vscode4teaching-webapp/src/app/components/index/index.component.html new file mode 100644 index 00000000..e080e8b0 --- /dev/null +++ b/vscode4teaching-webapp/src/app/components/index/index.component.html @@ -0,0 +1,57 @@ +
+
+ +
+
+

VSCode 4 Teaching

+

Extension for Visual Studio Code

+
+ +
Loading...
+
The code you entered could not be related to a course.
+
+ + +

{{ this.course?.creator?.name }} {{ this.course?.creator?.lastName }} invited you to join {{ this.course?.name }} at VSCode4Teaching!

+
If you want to join this course, please follow this steps:
+
+ +
Bring the programming exercises of a course directly to the student's editor, so that the teacher of that course can check the progress of the students and help them.
+

Tutorial

+
+

Install Visual Studio Code IDE if you have not installed it previously:

+ +

Install VSCode4Teaching extension if you have not installed it previously:

+ +

The first time you will have to sign up. After that you can log in:

+ Students signup demo + +

Join a course (the teacher will give you the code!):

+
+ +

Join the course using this code:

+
+ + +
+
+ Students code usage demo +

Now you can do the exercise! When you save a file, its contents will be able to be seen by the teachers:

+ Students edit exercise demo +

When you finish the exercise, push the Finish button:

+ Students finish exercise demo +

New exercise! Refresh the list of exercises in the course:

+ Students new exercise demo +
+
+
diff --git a/vscode4teaching-webapp/src/app/components/index/index.component.ts b/vscode4teaching-webapp/src/app/components/index/index.component.ts new file mode 100644 index 00000000..1ea8ffcc --- /dev/null +++ b/vscode4teaching-webapp/src/app/components/index/index.component.ts @@ -0,0 +1,61 @@ +import { Component, ElementRef, OnInit, ViewChild } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Course } from "src/app/model/course.model"; +import { CoursesService } from "src/app/services/courses.service"; + +@Component({ + selector: "app-index", + templateUrl: "./index.component.html", + styleUrls: ["./index.component.css"], +}) +export class IndexComponent implements OnInit { + /* + * VARIABLES + */ + code: string | undefined = undefined; // Invitation code (caught from URL) + course: Course | undefined = undefined; // Course associated to introduced code (if code is given and course is found) + loading: boolean = true; // True if waiting for server's response, false otherwise + error: boolean = false; + @ViewChild("codeCopyBtn") button!: ElementRef; + @ViewChild("codeCopyInput") input!: ElementRef; + + constructor(private route: ActivatedRoute, private coursesService: CoursesService) { + this.button; + } + + ngOnInit(): void { + if (this.route.snapshot.queryParamMap.has("code")) { + this.code = this.route.snapshot.queryParamMap.get("code") ?? ""; + this.coursesService.getCourseByCode(this.code).subscribe({ + next: (course) => { + this.course = course; + this.loading = false; + }, + error: (_) => (this.error = true), + }); + } else { + this.loading = false; + } + } + + // copyValue() + // Focuses into given input, selects its value and copies it to OS clipboard. + copyCode = () => { + this.input.nativeElement.focus(); + this.input.nativeElement.setSelectionRange(0, this.input.nativeElement.value.length); + if (!navigator.clipboard) { + document.execCommand("copy"); + } else { + navigator.clipboard.writeText(this.input.nativeElement.value).then(() => { + this.button.nativeElement.innerHTML = "Copied!"; + }); + } + }; + + // restoreStatus() + // Returns the Copy button and input to its "disabled" state. + restoreStatus = () => { + this.input.nativeElement.blur(); + this.input.nativeElement.innerHTML = "Copy"; + }; +} diff --git a/vscode4teaching-webapp/src/app/components/teacher-sign-up-form/teacher-sign-up-form.component.css b/vscode4teaching-webapp/src/app/components/teacher-sign-up-form/teacher-sign-up-form.component.css new file mode 100644 index 00000000..e69de29b diff --git a/vscode4teaching-webapp/src/app/components/teacher-sign-up-form/teacher-sign-up-form.component.html b/vscode4teaching-webapp/src/app/components/teacher-sign-up-form/teacher-sign-up-form.component.html new file mode 100644 index 00000000..6573c9ad --- /dev/null +++ b/vscode4teaching-webapp/src/app/components/teacher-sign-up-form/teacher-sign-up-form.component.html @@ -0,0 +1,80 @@ +
+

Sign up at VSCode4Teaching

+ +

Welcome to VSCode4Teaching! In order to finish your sign up process, please introduce the username and e-mail that were used to invite you.

+

Now, enter the password you wish to use to log in VSCode4Teaching.

+
+ +
+   + {{ this.error }} +
+
+ +
+
+
+ +
+
+ +
Username is required.
+
Username's length must be greater than 4 characters.
+
Username's length must be less than 50 characters.
+
Username cannot contain "template".
+
+
+
+
+ +
+
+
+
+ +
+
+
+ +
+
+ +
Password is required.
+
Password's length must be greater than 8 characters.
+
+
+
+
+ +
+
+ +
Password confirmation is required.
+
Passwords must coincide.
+
+
+
+
+ +
+
+
+
+ +
+ +
Welcome to VSCode4Teaching!
+
Sign up process has been successfully finished. You can start creating a new course in your VSCode4Teaching extension at Visual Studio Code and start teaching!
+
+
+
\ No newline at end of file diff --git a/vscode4teaching-webapp/src/app/components/teacher-sign-up-form/teacher-sign-up-form.component.ts b/vscode4teaching-webapp/src/app/components/teacher-sign-up-form/teacher-sign-up-form.component.ts new file mode 100644 index 00000000..21bf539b --- /dev/null +++ b/vscode4teaching-webapp/src/app/components/teacher-sign-up-form/teacher-sign-up-form.component.ts @@ -0,0 +1,130 @@ +import { Component } from "@angular/core"; +import { AbstractControl, FormBuilder, FormGroup, ValidationErrors, Validators } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { User } from "src/app/model/user.model"; +import { AuthTokenService } from "src/app/services/auth/auth-token.service"; +import { CommonService } from "src/app/services/common.service"; +import { TeacherSignUpService } from "src/app/services/teacher-sign-up.service"; + +@Component({ + selector: "app-teacher-sign-up-form", + templateUrl: "./teacher-sign-up-form.component.html", + styleUrls: ["./teacher-sign-up-form.component.css"], +}) +export class TeacherSignUpFormComponent { + /* + * VARIABLES + */ + tempPassword: string = ""; // Password (URL path variable) + requestSent: boolean = false; // True only if a request has been sent and response has not been received + step: number = 1; // Process' current step (may be 1, 2 or 3) + private user: User = {}; // User's information (filled after step 1 was successfully completed) + public error: string | undefined = undefined; // Error information + + /* + * CONSTRUCTOR + */ + constructor( + private route: ActivatedRoute, + private fb: FormBuilder, + private common: CommonService, // It includes XSRF and login requests + private teacherSignUpService: TeacherSignUpService, // Includes the password change request + private auth: AuthTokenService // It saves login credentials + ) { + // Temporary password is saved from URL's path variable + this.tempPassword = route.snapshot.params["tempPassword"]; + } + + /* + * FORMS (FormGroup created using FormBuilder) + */ + // Step 1 form -> asks for username + stepOneForm = this.fb.group({ + username: ["", [Validators.required, Validators.minLength(4), Validators.maxLength(50), Validators.pattern("^(?:(?!template).)+$")]], + }); + + // Step 2 form -> asks for a new password (two times) + stepTwoForm = this.fb.group( + { + password: ["", [Validators.required, Validators.minLength(8)]], + confirmPassword: ["", [Validators.required, Validators.minLength(8)]], + }, + { + // Custom validator -> checks if both fields' values are the same + validators: (control: AbstractControl): ValidationErrors | null => { + const password = control.get("password"); + const confirmPassword = control.get("confirmPassword"); + + const error = password && confirmPassword && password.value !== confirmPassword.value ? { passwordConfirmed: true } : control.get("confirmPassword")?.getError("required"); + control.get("confirmPassword")?.setErrors(error); + return error; + }, + } + ); + + /* + * COMPONENT'S LOGIC + */ + // Executed when step 1 is submitted + submitUsername() { + // GUI form's validation + this.stepOneForm.markAllAsTouched(); + // Login is performed catching username from input and password from path variable + if (this.stepOneForm.valid) { + const username = this.stepOneForm.get("username")?.value; + const password = this.tempPassword; + // Requests are starting to be sent + this.requestSent = true; + this.common.getXSRFToken().subscribe({ + next: (_) => { + this.common.login({ username, password }).subscribe({ + next: (resLogin) => { + this.auth.jwtToken = resLogin.jwtToken; + // Validación del correo electrónico + this.common.getCurrentUserInfo().subscribe({ + next: (usuario) => { + if (usuario === undefined) { + // User's info was not found (but login was successful) + this.error = "There happened a problem while trying to check your user information. Please try again later."; + } else { + // User was properly found and information has been saved => Step 2 + this.user = usuario; + this.step = 2; + this.requestSent = false; + } + }, + // Server's response to current user info's request was not successful + error: (_) => (this.error = "Unexpected error. Please try again later."), + }); + }, + // Login was not successful (username is wrong) + error: (_) => { + this.error = "The username you entered is not registered. Please try again."; + this.requestSent = false; + }, + }); + }, + // XSRF Token could not be saved (server is unavailable) + error: (_) => (this.error = "Unexpected error (server is not available). Please try again later."), + }); + } + } + + // Executed when step 2 is submitted + submitNewPassword() { + // GUI form's validation + this.stepTwoForm.markAllAsTouched(); + // Requests are starting to be sent + this.requestSent = true; + // Password is changed + this.teacherSignUpService.changePassword(this.user.id ?? 0, this.stepTwoForm.get("password")?.value).subscribe({ + next: (_) => (this.step = 3), + error: (_) => (this.error = "Unexpected error while saving your password. Please try again."), + }); + } + + // True if a input is valid, false otherwise (used in template) + getValidationStatusOfField(formGroup: FormGroup, fieldName: string, error?: string): boolean { + return error ? !!(formGroup.get(fieldName)?.touched && formGroup.get(fieldName)?.hasError(error)) : !!(formGroup.get(fieldName)?.touched && formGroup.get(fieldName)?.errors); + } +} diff --git a/vscode4teaching-webapp/src/app/model/course.model.ts b/vscode4teaching-webapp/src/app/model/course.model.ts new file mode 100644 index 00000000..8606a9f9 --- /dev/null +++ b/vscode4teaching-webapp/src/app/model/course.model.ts @@ -0,0 +1,7 @@ +import { User } from "./user.model"; + +export class Course { + public id?: number; + public name?: string; + public creator?: User; +} diff --git a/vscode4teaching-webapp/src/app/model/user.model.ts b/vscode4teaching-webapp/src/app/model/user.model.ts new file mode 100644 index 00000000..fecf61b8 --- /dev/null +++ b/vscode4teaching-webapp/src/app/model/user.model.ts @@ -0,0 +1,10 @@ +export class User { + public id?: number; + public email?: string; + public username?: string; + public password?: string; + public name?: string; + public lastName?: string; + public roles?: string; + public courses?: string; +} diff --git a/vscode4teaching-webapp/src/app/services/auth/auth-token.service.ts b/vscode4teaching-webapp/src/app/services/auth/auth-token.service.ts new file mode 100644 index 00000000..c19e1851 --- /dev/null +++ b/vscode4teaching-webapp/src/app/services/auth/auth-token.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from "@angular/core"; + +@Injectable({ + providedIn: "root", +}) +export class AuthTokenService { + public jwtToken: string | undefined; + + constructor() { + this.jwtToken = undefined; + } + + get isLogged(): boolean { + return !(this.jwtToken === undefined && this.jwtToken !== ""); + } +} diff --git a/vscode4teaching-webapp/src/app/services/auth/auth.interceptor.ts b/vscode4teaching-webapp/src/app/services/auth/auth.interceptor.ts new file mode 100644 index 00000000..155f7476 --- /dev/null +++ b/vscode4teaching-webapp/src/app/services/auth/auth.interceptor.ts @@ -0,0 +1,20 @@ +import { Injectable } from "@angular/core"; +import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from "@angular/common/http"; +import { Observable } from "rxjs"; +import { AuthTokenService } from "./auth-token.service"; + +const TOKEN_HEADER_KEY = "Authorization"; + +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + constructor(private tokenService: AuthTokenService) {} + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + if (this.tokenService.isLogged) { + request = request.clone({ + headers: request.headers.set(TOKEN_HEADER_KEY, "Bearer " + this.tokenService.jwtToken), + }); + } + return next.handle(request); + } +} diff --git a/vscode4teaching-webapp/src/app/services/common.service.ts b/vscode4teaching-webapp/src/app/services/common.service.ts new file mode 100644 index 00000000..d8cf89ae --- /dev/null +++ b/vscode4teaching-webapp/src/app/services/common.service.ts @@ -0,0 +1,42 @@ +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable, of } from "rxjs"; +import { User } from "../model/user.model"; +import { AuthTokenService } from "./auth/auth-token.service"; +import { environment } from "src/environments/environment"; + +@Injectable({ + providedIn: "root", +}) +export class CommonService { + // Base URL of REST API + public baseURL: string; + + constructor(private http: HttpClient, private auth: AuthTokenService, private window: Window) { + this.baseURL = "//" + this.window.location.hostname; + if (this.window.location.port) { + this.baseURL += ":" + (environment.production ? "8080" : "4200"); + } + } + + // XSRF Token has to be included in every request and it is saved as a cookie that is included in every request + getXSRFToken(): Observable { + return this.http.get(this.baseURL + "/api/csrf"); + } + + // Login into VSCode4Teaching webapp using username and password + login(credentials: { username: string; password: string }): Observable<{ jwtToken: string }> { + return this.http.post<{ jwtToken: string }>(this.baseURL + "/api/login", credentials, { + withCredentials: true, + }); + } + + // When a user is logged in, this method returns its information + getCurrentUserInfo(): Observable { + if (this.auth.isLogged) { + return this.http.get(this.baseURL + "/api/currentuser", { withCredentials: true }); + } else { + return of(undefined); + } + } +} diff --git a/vscode4teaching-webapp/src/app/services/courses.service.ts b/vscode4teaching-webapp/src/app/services/courses.service.ts new file mode 100644 index 00000000..aa361356 --- /dev/null +++ b/vscode4teaching-webapp/src/app/services/courses.service.ts @@ -0,0 +1,17 @@ +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { Course } from "../model/course.model"; +import { CommonService } from "./common.service"; + +@Injectable({ + providedIn: "root", +}) +export class CoursesService { + constructor(private http: HttpClient, private common: CommonService) {} + + // In version 2.1 + getCourseByCode(code: string): Observable { + return this.http.get(this.common.baseURL + "/api/v2/courses/code/" + code, { withCredentials: true }); + } +} diff --git a/vscode4teaching-webapp/src/app/services/teacher-sign-up.service.ts b/vscode4teaching-webapp/src/app/services/teacher-sign-up.service.ts new file mode 100644 index 00000000..623ee90d --- /dev/null +++ b/vscode4teaching-webapp/src/app/services/teacher-sign-up.service.ts @@ -0,0 +1,22 @@ +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable, of } from "rxjs"; +import { User } from "../model/user.model"; +import { CommonService } from "./common.service"; + +@Injectable({ + providedIn: "root", +}) +export class TeacherSignUpService { + constructor(private http: HttpClient, private common: CommonService) {} + + // Password modification process + changePassword(id: number, newPassword: string): Observable { + if (id === 0) { + return of(); + } + return this.http.patch(this.common.baseURL + "/api/users/" + id + "/password", newPassword, { + withCredentials: true, + }); + } +} diff --git a/vscode4teaching-webapp/src/assets/.gitkeep b/vscode4teaching-webapp/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/vscode4teaching-server/src/main/resources/static/fonts/Comfortaa-Light.ttf b/vscode4teaching-webapp/src/assets/fonts/Comfortaa-Light.ttf similarity index 100% rename from vscode4teaching-server/src/main/resources/static/fonts/Comfortaa-Light.ttf rename to vscode4teaching-webapp/src/assets/fonts/Comfortaa-Light.ttf diff --git a/vscode4teaching-server/src/main/resources/static/fonts/Louis George Cafe.ttf b/vscode4teaching-webapp/src/assets/fonts/Louis George Cafe.ttf similarity index 100% rename from vscode4teaching-server/src/main/resources/static/fonts/Louis George Cafe.ttf rename to vscode4teaching-webapp/src/assets/fonts/Louis George Cafe.ttf diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.ttf new file mode 100644 index 00000000..cea8d5db Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.woff new file mode 100644 index 00000000..4129ac6a Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.woff2 new file mode 100644 index 00000000..22221150 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Black.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.ttf new file mode 100644 index 00000000..9c4b1f32 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.woff new file mode 100644 index 00000000..7ce4bf6e Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.woff2 new file mode 100644 index 00000000..398b66ae Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-BlackItalic.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.ttf new file mode 100644 index 00000000..3d9130a7 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.woff new file mode 100644 index 00000000..8d749882 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.woff2 new file mode 100644 index 00000000..3f850667 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Bold.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.ttf new file mode 100644 index 00000000..dce2d7b2 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.woff new file mode 100644 index 00000000..27b5be84 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.woff2 new file mode 100644 index 00000000..4d2414f3 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-BoldItalic.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.ttf new file mode 100644 index 00000000..58b96dcd Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.woff new file mode 100644 index 00000000..0124cca0 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.woff2 new file mode 100644 index 00000000..75af4b94 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Italic.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.ttf new file mode 100644 index 00000000..3c7bbe8d Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.woff new file mode 100644 index 00000000..b5cbe059 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.woff2 new file mode 100644 index 00000000..e08ef74a Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Light.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.ttf new file mode 100644 index 00000000..0a6de70a Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.woff new file mode 100644 index 00000000..676b4830 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.woff2 new file mode 100644 index 00000000..28b1752f Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-LightItalic.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.ttf new file mode 100644 index 00000000..b1347dd7 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.woff new file mode 100644 index 00000000..58c277ed Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.woff2 new file mode 100644 index 00000000..68172bcf Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Medium.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.ttf new file mode 100644 index 00000000..73077c62 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.woff new file mode 100644 index 00000000..4b843fa7 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.woff2 new file mode 100644 index 00000000..a420a597 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-MediumItalic.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.ttf new file mode 100644 index 00000000..8722b5ed Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.woff new file mode 100644 index 00000000..558a6e1f Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.woff2 new file mode 100644 index 00000000..730399ba Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Regular.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.ttf new file mode 100644 index 00000000..cf910eed Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.woff new file mode 100644 index 00000000..d4e31262 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.woff2 new file mode 100644 index 00000000..41b12b09 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-Thin.woff2 differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.ttf b/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.ttf new file mode 100644 index 00000000..f9f5f3b5 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.ttf differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.woff b/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.woff new file mode 100644 index 00000000..2a72c669 Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.woff differ diff --git a/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.woff2 b/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.woff2 new file mode 100644 index 00000000..3c4815ec Binary files /dev/null and b/vscode4teaching-webapp/src/assets/fonts/Roboto-ThinItalic.woff2 differ diff --git a/vscode4teaching-server/src/main/resources/static/fonts/moon_get-Heavy.otf b/vscode4teaching-webapp/src/assets/fonts/moon_get-Heavy.otf similarity index 100% rename from vscode4teaching-server/src/main/resources/static/fonts/moon_get-Heavy.otf rename to vscode4teaching-webapp/src/assets/fonts/moon_get-Heavy.otf diff --git a/vscode4teaching-server/src/main/resources/static/img/signup.gif b/vscode4teaching-webapp/src/assets/img/signup.gif similarity index 100% rename from vscode4teaching-server/src/main/resources/static/img/signup.gif rename to vscode4teaching-webapp/src/assets/img/signup.gif diff --git a/vscode4teaching-server/src/main/resources/static/img/student_finish_exercise.gif b/vscode4teaching-webapp/src/assets/img/student_finish_exercise.gif similarity index 100% rename from vscode4teaching-server/src/main/resources/static/img/student_finish_exercise.gif rename to vscode4teaching-webapp/src/assets/img/student_finish_exercise.gif diff --git a/vscode4teaching-server/src/main/resources/static/img/student_gets_course.gif b/vscode4teaching-webapp/src/assets/img/student_gets_course.gif similarity index 100% rename from vscode4teaching-server/src/main/resources/static/img/student_gets_course.gif rename to vscode4teaching-webapp/src/assets/img/student_gets_course.gif diff --git a/vscode4teaching-server/src/main/resources/static/img/student_refresh_course.gif b/vscode4teaching-webapp/src/assets/img/student_refresh_course.gif similarity index 100% rename from vscode4teaching-server/src/main/resources/static/img/student_refresh_course.gif rename to vscode4teaching-webapp/src/assets/img/student_refresh_course.gif diff --git a/vscode4teaching-server/src/main/resources/static/img/student_solving_exercise.gif b/vscode4teaching-webapp/src/assets/img/student_solving_exercise.gif similarity index 100% rename from vscode4teaching-server/src/main/resources/static/img/student_solving_exercise.gif rename to vscode4teaching-webapp/src/assets/img/student_solving_exercise.gif diff --git a/vscode4teaching-server/src/main/resources/static/img/v4ticon.png b/vscode4teaching-webapp/src/assets/img/v4ticon.png similarity index 100% rename from vscode4teaching-server/src/main/resources/static/img/v4ticon.png rename to vscode4teaching-webapp/src/assets/img/v4ticon.png diff --git a/vscode4teaching-webapp/src/assets/img/vscode.png b/vscode4teaching-webapp/src/assets/img/vscode.png new file mode 100644 index 00000000..ad4dfb6b Binary files /dev/null and b/vscode4teaching-webapp/src/assets/img/vscode.png differ diff --git a/vscode4teaching-webapp/src/environments/environment.prod.ts b/vscode4teaching-webapp/src/environments/environment.prod.ts new file mode 100644 index 00000000..3612073b --- /dev/null +++ b/vscode4teaching-webapp/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/vscode4teaching-webapp/src/environments/environment.ts b/vscode4teaching-webapp/src/environments/environment.ts new file mode 100644 index 00000000..f56ff470 --- /dev/null +++ b/vscode4teaching-webapp/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/vscode4teaching-server/src/main/resources/static/img/favicon.ico b/vscode4teaching-webapp/src/favicon.ico similarity index 100% rename from vscode4teaching-server/src/main/resources/static/img/favicon.ico rename to vscode4teaching-webapp/src/favicon.ico diff --git a/vscode4teaching-webapp/src/index.html b/vscode4teaching-webapp/src/index.html new file mode 100644 index 00000000..aec09589 --- /dev/null +++ b/vscode4teaching-webapp/src/index.html @@ -0,0 +1,13 @@ + + + + + VSCode4Teaching + + + + + + + + diff --git a/vscode4teaching-webapp/src/main.ts b/vscode4teaching-webapp/src/main.ts new file mode 100644 index 00000000..c7b673cf --- /dev/null +++ b/vscode4teaching-webapp/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/vscode4teaching-webapp/src/polyfills.ts b/vscode4teaching-webapp/src/polyfills.ts new file mode 100644 index 00000000..429bb9ef --- /dev/null +++ b/vscode4teaching-webapp/src/polyfills.ts @@ -0,0 +1,53 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes recent versions of Safari, Chrome (including + * Opera), Edge on the desktop, and iOS and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/vscode4teaching-webapp/src/proxy.conf.json b/vscode4teaching-webapp/src/proxy.conf.json new file mode 100644 index 00000000..9cac910a --- /dev/null +++ b/vscode4teaching-webapp/src/proxy.conf.json @@ -0,0 +1,8 @@ +{ + "/api/*": { + "target": "http://127.0.0.1:8080", + "secure": false, + "logLevel": "debug", + "changeOrigin": true + } +} diff --git a/vscode4teaching-webapp/src/styles.css b/vscode4teaching-webapp/src/styles.css new file mode 100644 index 00000000..d3ca65b2 --- /dev/null +++ b/vscode4teaching-webapp/src/styles.css @@ -0,0 +1,218 @@ +/* + * OWN STYLES + */ + +body { + background: #fff8f7; + font-family: "Roboto", sans-serif; +} + +h2 { + color: #f44a3e; + text-align: center; +} + +p { + text-align: justify; +} + +.container-small { + width: 35vw; + background-color: white; + padding: 3rem 1rem; + box-shadow: 0px 0px 20px rgba(244, 74, 62, 0.5); + display: flex; + animation: FadeIn 1s 1 ease-in-out; +} + +.container-big { + width: 60vw; + background-color: white; + padding: 2rem; + box-shadow: 0px 0px 20px rgba(244, 74, 62, 0.5); + display: flex; + animation: FadeIn 1s 1 ease-in-out; +} + +@media screen and (max-width: 992px) { + .container-small { + width: 70vw; + } + + .container-big { + width: 85vw; + } +} + +@media screen and (max-width: 768px) { + .container-small, + .container-big { + width: 100vw; + } +} + +/* + * BOOTSTRAP OVERRIDINGS + */ + +.row { + margin: 0.5rem 0; +} + +.form-control:focus { + border-color: #f44a3e; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(244, 74, 62, 0.25); +} + +.btn-outline-v4twebapp { + color: #f44a3e; + border-color: #f44a3e; +} + +.btn-outline-v4twebapp:hover { + color: #fff; + background-color: #f44a3e; + border-color: #f44a3e; +} + +.btn-outline-v4twebapp:active { + color: #fff; + background-color: #eb463b; + border-color: #eb463b; +} + +.btn-outline-v4twebapp:focus { + box-shadow: 0 0 0 0.25rem rgb(244 74 62 / 50%); +} + +/* + * KEYFRAMES AND FONT-FACE DECLARATIONS + */ +@keyframes FadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Medium"), local("Roboto-Medium"), url("assets/fonts/Roboto-Medium.woff2") format("woff2"), + url("assets/fonts/Roboto-Medium.woff") format("woff"), url("assets/fonts/Roboto-Medium.ttf") format("truetype"); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Bold"), local("Roboto-Bold"), url("assets/fonts/Roboto-Bold.woff2") format("woff2"), + url("assets/fonts/Roboto-Bold.woff") format("woff"), url("assets/fonts/Roboto-Bold.ttf") format("truetype"); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Bold Italic"), local("Roboto-BoldItalic"), + url("assets/fonts/Roboto-BoldItalic.woff2") format("woff2"), + url("assets/fonts/Roboto-BoldItalic.woff") format("woff"), + url("assets/fonts/Roboto-BoldItalic.ttf") format("truetype"); + font-weight: bold; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Medium Italic"), local("Roboto-MediumItalic"), + url("assets/fonts/Roboto-MediumItalic.woff2") format("woff2"), + url("assets/fonts/Roboto-MediumItalic.woff") format("woff"), + url("assets/fonts/Roboto-MediumItalic.ttf") format("truetype"); + font-weight: 500; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Light Italic"), local("Roboto-LightItalic"), + url("assets/fonts/Roboto-LightItalic.woff2") format("woff2"), + url("assets/fonts/Roboto-LightItalic.woff") format("woff"), + url("assets/fonts/Roboto-LightItalic.ttf") format("truetype"); + font-weight: 300; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Black"), local("Roboto-Black"), url("assets/fonts/Roboto-Black.woff2") format("woff2"), + url("assets/fonts/Roboto-Black.woff") format("woff"), url("assets/fonts/Roboto-Black.ttf") format("truetype"); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Light"), local("Roboto-Light"), url("assets/fonts/Roboto-Light.woff2") format("woff2"), + url("assets/fonts/Roboto-Light.woff") format("woff"), url("assets/fonts/Roboto-Light.ttf") format("truetype"); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Black Italic"), local("Roboto-BlackItalic"), + url("assets/fonts/Roboto-BlackItalic.woff2") format("woff2"), + url("assets/fonts/Roboto-BlackItalic.woff") format("woff"), + url("assets/fonts/Roboto-BlackItalic.ttf") format("truetype"); + font-weight: 900; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Italic"), local("Roboto-Italic"), url("assets/fonts/Roboto-Italic.woff2") format("woff2"), + url("assets/fonts/Roboto-Italic.woff") format("woff"), url("assets/fonts/Roboto-Italic.ttf") format("truetype"); + font-weight: normal; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto"), local("Roboto-Regular"), url("assets/fonts/Roboto-Regular.woff2") format("woff2"), + url("assets/fonts/Roboto-Regular.woff") format("woff"), + url("assets/fonts/Roboto-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Thin Italic"), local("Roboto-ThinItalic"), + url("assets/fonts/Roboto-ThinItalic.woff2") format("woff2"), + url("assets/fonts/Roboto-ThinItalic.woff") format("woff"), + url("assets/fonts/Roboto-ThinItalic.ttf") format("truetype"); + font-weight: 100; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Roboto"; + src: local("Roboto Thin"), local("Roboto-Thin"), url("assets/fonts/Roboto-Thin.woff2") format("woff2"), + url("assets/fonts/Roboto-Thin.woff") format("woff"), url("assets/fonts/Roboto-Thin.ttf") format("truetype"); + font-weight: 100; + font-style: normal; + font-display: swap; +} diff --git a/vscode4teaching-webapp/src/test.ts b/vscode4teaching-webapp/src/test.ts new file mode 100644 index 00000000..00025daf --- /dev/null +++ b/vscode4teaching-webapp/src/test.ts @@ -0,0 +1,26 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: { + context(path: string, deep?: boolean, filter?: RegExp): { + (id: string): T; + keys(): string[]; + }; +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); + +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/vscode4teaching-webapp/tsconfig.app.json b/vscode4teaching-webapp/tsconfig.app.json new file mode 100644 index 00000000..82d91dc4 --- /dev/null +++ b/vscode4teaching-webapp/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/vscode4teaching-webapp/tsconfig.json b/vscode4teaching-webapp/tsconfig.json new file mode 100644 index 00000000..f531992d --- /dev/null +++ b/vscode4teaching-webapp/tsconfig.json @@ -0,0 +1,32 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "es2017", + "module": "es2020", + "lib": [ + "es2020", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/vscode4teaching-webapp/tsconfig.spec.json b/vscode4teaching-webapp/tsconfig.spec.json new file mode 100644 index 00000000..092345b0 --- /dev/null +++ b/vscode4teaching-webapp/tsconfig.spec.json @@ -0,0 +1,18 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +}