From 630220e0d18bfd94087a350962670f4f95cfa251 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Thu, 29 Apr 2021 11:52:04 -0700 Subject: [PATCH 01/66] start attestation --- .../lambda-functions/JavaWebAuthnLib/pom.xml | 6 + .../SimpleTrustResolverWithEquality.java | 71 +++++++ .../src/main/java/com/yubicolabs/App.java | 69 +++++++ .../src/main/resources/metadata.json | 189 ++++++++++++++++++ 4 files changed, 335 insertions(+) create mode 100644 backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubico/webauthn/attestation/resolver/SimpleTrustResolverWithEquality.java create mode 100644 backend/lambda-functions/JavaWebAuthnLib/src/main/resources/metadata.json diff --git a/backend/lambda-functions/JavaWebAuthnLib/pom.xml b/backend/lambda-functions/JavaWebAuthnLib/pom.xml index 2077c66..9b09bb9 100644 --- a/backend/lambda-functions/JavaWebAuthnLib/pom.xml +++ b/backend/lambda-functions/JavaWebAuthnLib/pom.xml @@ -101,6 +101,12 @@ 2.14.1 + + com.google.guava + guava + 30.1.1-jre + + com.google.code.gson gson diff --git a/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubico/webauthn/attestation/resolver/SimpleTrustResolverWithEquality.java b/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubico/webauthn/attestation/resolver/SimpleTrustResolverWithEquality.java new file mode 100644 index 0000000..bf4ff10 --- /dev/null +++ b/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubico/webauthn/attestation/resolver/SimpleTrustResolverWithEquality.java @@ -0,0 +1,71 @@ +// Copyright (c) 2018, Yubico AB +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.yubico.webauthn.attestation.resolver; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import com.yubico.webauthn.attestation.TrustResolver; +import java.security.cert.X509Certificate; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +/** + * Resolves a metadata object whose associated certificate has signed the argument certificate, or + * is equal to the argument certificate. + */ +public class SimpleTrustResolverWithEquality implements TrustResolver { + + private final SimpleTrustResolver subresolver; + private final Multimap trustedCerts = ArrayListMultimap.create(); + + public SimpleTrustResolverWithEquality(Collection trustedCertificates) { + subresolver = new SimpleTrustResolver(trustedCertificates); + + for (X509Certificate cert : trustedCertificates) { + trustedCerts.put(cert.getSubjectDN().getName(), cert); + } + } + + @Override + public Optional resolveTrustAnchor( + X509Certificate attestationCertificate, List caCertificateChain) { + Optional subResult = + subresolver.resolveTrustAnchor(attestationCertificate, caCertificateChain); + + if (subResult.isPresent()) { + return subResult; + } else { + for (X509Certificate cert : + trustedCerts.get(attestationCertificate.getSubjectDN().getName())) { + if (cert.equals(attestationCertificate)) { + return Optional.of(cert); + } + } + + return Optional.empty(); + } + } +} diff --git a/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java b/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java index a089600..2c86964 100644 --- a/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java +++ b/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java @@ -4,6 +4,7 @@ import com.amazonaws.services.lambda.runtime.RequestHandler; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.io.Closeables; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; @@ -19,6 +20,15 @@ import com.yubico.webauthn.StartAssertionOptions; import com.yubico.webauthn.StartRegistrationOptions; import com.yubico.webauthn.attestation.Attestation; +import com.yubico.webauthn.attestation.AttestationResolver; +import com.yubico.webauthn.attestation.MetadataObject; +import com.yubico.webauthn.attestation.MetadataService; +import com.yubico.webauthn.attestation.StandardMetadataService; +import com.yubico.webauthn.attestation.TrustResolver; +import com.yubico.webauthn.attestation.resolver.CompositeAttestationResolver; +import com.yubico.webauthn.attestation.resolver.CompositeTrustResolver; +import com.yubico.webauthn.attestation.resolver.SimpleAttestationResolver; +import com.yubico.webauthn.attestation.resolver.SimpleTrustResolverWithEquality; import com.yubico.webauthn.data.AttestationConveyancePreference; import com.yubico.webauthn.data.AuthenticatorSelectionCriteria; import com.yubico.webauthn.data.ByteArray; @@ -32,9 +42,14 @@ import com.yubicolabs.data.CredentialRegistration; import com.yubicolabs.data.RegistrationRequest; import com.yubicolabs.data.RegistrationResponse; +import java.security.cert.CertificateException; +import java.io.IOException; +import java.io.InputStream; import java.security.SecureRandom; import java.time.Clock; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Optional; import lombok.extern.slf4j.Slf4j; @@ -59,16 +74,70 @@ public class App implements RequestHandler { private final RegistrationRequestStorage registerRequestStorage = new RegistrationRequestStorage(); private final RegistrationStorage userStorage = new RDSRegistrationStorage(); + private static final String METADATA_PATH = "/metadata.json"; + + private final TrustResolver trustResolver = + new CompositeTrustResolver( + Arrays.asList( + StandardMetadataService.createDefaultTrustResolver(), createExtraTrustResolver())); + + private final MetadataService metadataService = + new StandardMetadataService( + new CompositeAttestationResolver( + Arrays.asList( + StandardMetadataService.createDefaultAttestationResolver(trustResolver), + createExtraMetadataResolver(trustResolver)))); + private final RelyingParty rp = RelyingParty.builder() .identity(Config.getRpIdentity()) .credentialRepository(this.userStorage) .origins(Config.getOrigins()) .attestationConveyancePreference(Optional.of(AttestationConveyancePreference.DIRECT)) + .metadataService(Optional.of(metadataService)) .allowUnrequestedExtensions(true) .allowUntrustedAttestation(true) .validateSignatureCounter(true) .build(); + private static MetadataObject readMetadata() { + InputStream is = App.class.getResourceAsStream(METADATA_PATH); + try { + return JacksonCodecs.json().readValue(is, MetadataObject.class); + } catch (IOException e) { + log.error("Failed to read metadata from " + METADATA_PATH, e); + return e; + } finally { + Closeables.closeQuietly(is); + } + } + + /** + * Create a {@link TrustResolver} that accepts attestation certificates that are + * directly recognised as trust anchors. + */ + private static TrustResolver createExtraTrustResolver() { + try { + MetadataObject metadata = readMetadata(); + return new SimpleTrustResolverWithEquality(metadata.getParsedTrustedCertificates()); + } catch (CertificateException e) { + log.error("Failed to read trusted certificate(s)", e); + return e; + } + } + + /** + * Create a {@link AttestationResolver} with additional metadata for YubiKey devices. + */ + private static AttestationResolver createExtraMetadataResolver(TrustResolver trustResolver) { + try { + MetadataObject metadata = readMetadata(); + return new SimpleAttestationResolver(Collections.singleton(metadata), trustResolver); + } catch (CertificateException e) { + log.error("Failed to read trusted certificate(s)", e); + return e; + } + } + public App() { jsonMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); } diff --git a/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/metadata.json b/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/metadata.json new file mode 100644 index 0000000..1716d78 --- /dev/null +++ b/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/metadata.json @@ -0,0 +1,189 @@ +{ + "identifier": "2fb54029-7613-4f1d-94f1-fb876c14a6fe", + "version": 11, + "vendorInfo": { + "url": "https://yubico.com", + "imageUrl": "https://developers.yubico.com/U2F/Images/yubico.png", + "name": "Yubico" + }, + "trustedCertificates": [ + "-----BEGIN CERTIFICATE-----\nMIIDHjCCAgagAwIBAgIEG1BT9zANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQDEyNZ\ndWJpY28gVTJGIFJvb3QgQ0EgU2VyaWFsIDQ1NzIwMDYzMTAgFw0xNDA4MDEwMDAw\nMDBaGA8yMDUwMDkwNDAwMDAwMFowLjEsMCoGA1UEAxMjWXViaWNvIFUyRiBSb290\nIENBIFNlcmlhbCA0NTcyMDA2MzEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQC/jwYuhBVlqaiYWEMsrWFisgJ+PtM91eSrpI4TK7U53mwCIawSDHy8vUmk\n5N2KAj9abvT9NP5SMS1hQi3usxoYGonXQgfO6ZXyUA9a+KAkqdFnBnlyugSeCOep\n8EdZFfsaRFtMjkwz5Gcz2Py4vIYvCdMHPtwaz0bVuzneueIEz6TnQjE63Rdt2zbw\nnebwTG5ZybeWSwbzy+BJ34ZHcUhPAY89yJQXuE0IzMZFcEBbPNRbWECRKgjq//qT\n9nmDOFVlSRCt2wiqPSzluwn+v+suQEBsUjTGMEd25tKXXTkNW21wIWbxeSyUoTXw\nLvGS6xlwQSgNpk2qXYwf8iXg7VWZAgMBAAGjQjBAMB0GA1UdDgQWBBQgIvz0bNGJ\nhjgpToksyKpP9xv9oDAPBgNVHRMECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAN\nBgkqhkiG9w0BAQsFAAOCAQEAjvjuOMDSa+JXFCLyBKsycXtBVZsJ4Ue3LbaEsPY4\nMYN/hIQ5ZM5p7EjfcnMG4CtYkNsfNHc0AhBLdq45rnT87q/6O3vUEtNMafbhU6kt\nhX7Y+9XFN9NpmYxr+ekVY5xOxi8h9JDIgoMP4VB1uS0aunL1IGqrNooL9mmFnL2k\nLVVee6/VR6C5+KSTCMCWppMuJIZII2v9o4dkoZ8Y7QRjQlLfYzd3qGtKbw7xaF1U\nsG/5xUb/Btwb2X2g4InpiB/yt/3CpQXpiWX/K4mBvUKiGn05ZsqeY1gx4g0xLBqc\nU9psmyPzK+Vsgw2jeRQ5JlKDyqE0hebfC1tvFu0CCrJFcw==\n-----END CERTIFICATE-----" + ], + "devices": [ + { + "deviceId": "1.3.6.1.4.1.41482.1.1", + "displayName": "Security Key NFC by Yubico", + "transports": 12, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000019469-security-key-nfc", + "imageUrl": "https://developers.yubico.com/U2F/Images/SKY-NFC.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "6d44ba9bf6ec2e49b9300c8fe920cb73" + } + } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.1", + "displayName": "Security Key by Yubico", + "transports": 4, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006900-security-key-by-yubico", + "imageUrl": "https://developers.yubico.com/U2F/Images/SKY.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.41482.1.1" + } + }, + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.1", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + { + "deviceId": "1.3.6.1.4.1.41482.1.2", + "displayName": "YubiKey NEO/NEO-n", + "transports": 12, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006494-yubikey-neo", + "imageUrl": "https://developers.yubico.com/U2F/Images/NEO.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.41482.1.2" + } + }, + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.2", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + { + "deviceId": "1.3.6.1.4.1.41482.1.3", + "displayName": "YubiKey Plus", + "transports": 4, + "deviceUrl": "https://www.yubico.com/products/yubikey-hardware/", + "imageUrl": "https://developers.yubico.com/U2F/Images/PLS.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.41482.1.3" + } + }, + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.3", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + { + "deviceId": "1.3.6.1.4.1.41482.1.4", + "displayName": "YubiKey Edge", + "transports": 4, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006492-yubikey-edge", + "imageUrl": "https://developers.yubico.com/U2F/Images/YKE.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.4", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + { + "deviceId": "1.3.6.1.4.1.41482.1.5", + "displayName": "YubiKey 4/YubiKey 4 Nano", + "transports": 4, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006486-yubikey-4", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK4.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.5", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5 NFC", + "transports": 12, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000014174--yubikey-5-nfc", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "fa2b99dc9e3942578f924a30d23c4118" + } + } + } + ] + }, + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5 Series security key", + "transports": 4, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000014180-yubikey-5c", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5-series.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "cb69481e8ff7403993ec0a2729a154a8" + } + } + } + ] + }, + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5Ci", + "transports": 20, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000027140-yubikey-5ci", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5Ci.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "c5ef55ffad9a4b9fb580adebafe026d0" + } + } + } + ] + } + ] + } \ No newline at end of file From d58f29e1a954d1d6478f97d60afc046230e27404 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Fri, 30 Apr 2021 15:17:18 -0700 Subject: [PATCH 02/66] add attestation and set logging to debug level --- .../src/main/java/com/yubicolabs/App.java | 43 +++++++++++++------ .../src/main/resources/log4j2.xml | 1 + 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java b/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java index 2c86964..32c5fa0 100644 --- a/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java +++ b/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java @@ -76,17 +76,10 @@ public class App implements RequestHandler { private static final String METADATA_PATH = "/metadata.json"; - private final TrustResolver trustResolver = - new CompositeTrustResolver( - Arrays.asList( - StandardMetadataService.createDefaultTrustResolver(), createExtraTrustResolver())); + private final TrustResolver trustResolver = createTrustResolver(); - private final MetadataService metadataService = - new StandardMetadataService( - new CompositeAttestationResolver( - Arrays.asList( - StandardMetadataService.createDefaultAttestationResolver(trustResolver), - createExtraMetadataResolver(trustResolver)))); + private final MetadataService metadataService = createMetaDataService(); + private final RelyingParty rp = RelyingParty.builder() .identity(Config.getRpIdentity()) @@ -105,12 +98,36 @@ private static MetadataObject readMetadata() { return JacksonCodecs.json().readValue(is, MetadataObject.class); } catch (IOException e) { log.error("Failed to read metadata from " + METADATA_PATH, e); - return e; + throw new RuntimeException(e.getMessage()); } finally { Closeables.closeQuietly(is); } } + private TrustResolver createTrustResolver() { + try { + return new CompositeTrustResolver( + Arrays.asList( + StandardMetadataService.createDefaultTrustResolver(), createExtraTrustResolver())); + } catch (CertificateException e) { + log.error("Failed to read trusted certificate(s)", e); + throw new RuntimeException(e.getMessage()); + } + } + + private MetadataService createMetaDataService() { + try { + return new StandardMetadataService( + new CompositeAttestationResolver( + Arrays.asList( + StandardMetadataService.createDefaultAttestationResolver(trustResolver), + createExtraMetadataResolver(trustResolver)))); + } catch (CertificateException e) { + log.error("Failed to read trusted certificate(s)", e); + throw new RuntimeException(e.getMessage()); + } + } + /** * Create a {@link TrustResolver} that accepts attestation certificates that are * directly recognised as trust anchors. @@ -121,7 +138,7 @@ private static TrustResolver createExtraTrustResolver() { return new SimpleTrustResolverWithEquality(metadata.getParsedTrustedCertificates()); } catch (CertificateException e) { log.error("Failed to read trusted certificate(s)", e); - return e; + throw new RuntimeException(e.getMessage()); } } @@ -134,7 +151,7 @@ private static AttestationResolver createExtraMetadataResolver(TrustResolver tru return new SimpleAttestationResolver(Collections.singleton(metadata), trustResolver); } catch (CertificateException e) { log.error("Failed to read trusted certificate(s)", e); - return e; + throw new RuntimeException(e.getMessage()); } } diff --git a/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/log4j2.xml b/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/log4j2.xml index 91e8b2c..630fac0 100644 --- a/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/log4j2.xml +++ b/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/log4j2.xml @@ -12,5 +12,6 @@ + \ No newline at end of file From 9f4087ff2a8e8553234b9bbc5d42650c553cefc4 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Tue, 4 May 2021 13:30:13 -0700 Subject: [PATCH 03/66] display attestation metadata --- clients/web/react/src/HomePage/HomePage.jsx | 5 ++++- clients/web/react/src/RegisterPage/RegisterPage.jsx | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 79085b3..f67333d 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -86,6 +86,7 @@ function HomePage() { const [show, setShow] = useState(false); const [nickname, setNickname] = useState(''); const [credential, setCredential] = useState(''); + const [attestationMetadata, setAttestationMetadata] = useState(''); const [invalidNickname, setInvalidNickname] = useState(undefined); const [submitted, setSubmitted] = useState(false); const defaultInvalidPIN = -1; @@ -120,6 +121,7 @@ function HomePage() { const handleShow = (credential) => { setNickname(credential.credentialNickname.value); setCredential(credential); + setAttestationMetadata(credential.attestationMetadata.value); setShow(true); } const handleChange = (e) => { @@ -242,8 +244,9 @@ function HomePage() { handleSave(); ev.preventDefault(); } - }}/> + }}/>
{ invalidNickname ? {invalidNickname} : null } +   



diff --git a/clients/web/react/src/RegisterPage/RegisterPage.jsx b/clients/web/react/src/RegisterPage/RegisterPage.jsx index de01c1e..7f7437c 100644 --- a/clients/web/react/src/RegisterPage/RegisterPage.jsx +++ b/clients/web/react/src/RegisterPage/RegisterPage.jsx @@ -111,7 +111,7 @@ function RegisterPage() { if(uv == false) { dispatch(credentialActions.getUV(challengeResponse)); } else { - console.log("sendCustomChallengeAnswer: ", user); + console.log("handleWebAuthn:sendCustomChallengeAnswer: ", cognitoUser); // to send the answer of the custom challenge const user = await Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) .then(user => { @@ -214,7 +214,7 @@ function RegisterPage() { Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) .then(user => { - console.log("uv sendCustomChallengeAnswer: ", user); + console.log("uv finishUVResponse sendCustomChallengeAnswer: ", user); Auth.currentSession() .then(data => { @@ -236,7 +236,7 @@ function RegisterPage() { }) .catch(err => { - console.log("sendCustomChallengeAnswer error: ", err); + console.log("uv finishUVResponse sendCustomChallengeAnswer error: ", err); let message = "Invalid PIN"; dispatch(alertActions.error(message)); setSubmitted(false); From 83ec9422768f66a04c4edd3afdaf6177ad5eaa95 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Thu, 20 May 2021 14:37:21 -0700 Subject: [PATCH 04/66] Identity first flow prototype --- clients/web/react/package-lock.json | 532 +++++++++++++++++- clients/web/react/package.json | 3 + clients/web/react/src/App/App.jsx | 2 + .../IdentifierFirstFlowProto.jsx | 75 +++ .../src/IdentifierFirstFlowProto/index.js | 1 + .../web/react/src/_components/ForgotStep.js | 47 ++ .../src/_components/IdentifierFirstFlow.jsx | 64 +++ .../web/react/src/_components/LoginStep.js | 61 ++ .../react/src/_components/PromptSvPinStep.js | 50 ++ .../src/_components/RegisterSvPinStep.js | 57 ++ .../_components/RegisterTrustedDeviceStep.js | 58 ++ .../web/react/src/_components/SignUpStep.js | 61 ++ .../src/_components/component.module.css | 26 + clients/web/react/src/_components/index.js | 1 + clients/web/react/webpack.config.js | 4 + 15 files changed, 1024 insertions(+), 18 deletions(-) create mode 100755 clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx create mode 100644 clients/web/react/src/IdentifierFirstFlowProto/index.js create mode 100644 clients/web/react/src/_components/ForgotStep.js create mode 100644 clients/web/react/src/_components/IdentifierFirstFlow.jsx create mode 100644 clients/web/react/src/_components/LoginStep.js create mode 100644 clients/web/react/src/_components/PromptSvPinStep.js create mode 100644 clients/web/react/src/_components/RegisterSvPinStep.js create mode 100644 clients/web/react/src/_components/RegisterTrustedDeviceStep.js create mode 100644 clients/web/react/src/_components/SignUpStep.js create mode 100644 clients/web/react/src/_components/component.module.css diff --git a/clients/web/react/package-lock.json b/clients/web/react/package-lock.json index 92964b2..83f382c 100644 --- a/clients/web/react/package-lock.json +++ b/clients/web/react/package-lock.json @@ -19,6 +19,7 @@ "react": "^16.14.0", "react-bootstrap": "^1.4.0", "react-dom": "^16.14.0", + "react-hooks-helper": "^1.6.0", "react-redux": "^7.2.2", "react-router-dom": "^5.2.0", "redux": "^4.0.5", @@ -33,8 +34,10 @@ "@babel/preset-react": "^7.12.1", "@babel/runtime": "^7.12.1", "babel-loader": "^8.1.0", + "css-loader": "^5.2.4", "html-webpack-plugin": "^3.2.0", "path": "^0.12.7", + "style-loader": "^2.0.0", "webpack": "^4.44.2", "webpack-cli": "^3.3.12", "webpack-dev-server": "^3.11.0" @@ -5686,7 +5689,6 @@ "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -6357,6 +6359,112 @@ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" }, + "node_modules/css-loader": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.4.tgz", + "integrity": "sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw==", + "dev": true, + "dependencies": { + "camelcase": "^6.2.0", + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.10", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/css-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-loader/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/css-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", @@ -6381,6 +6489,18 @@ "url": "https://github.com/sponsors/fb55" } }, + "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/csstype": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", @@ -8346,6 +8466,18 @@ "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/idb": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/idb/-/idb-5.0.6.tgz", @@ -8982,7 +9114,6 @@ "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", "jest-serializer": "^26.6.2", @@ -9497,9 +9628,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "peer": true, - "dependencies": { - "graceful-fs": "^4.1.6" - }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -9534,9 +9662,6 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "peer": true, - "dependencies": { - "graceful-fs": "^4.1.9" - }, "optionalDependencies": { "graceful-fs": "^4.1.9" } @@ -10556,9 +10681,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "peer": true, - "dependencies": { - "graceful-fs": "^4.1.6" - }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -10899,6 +11021,18 @@ "dev": true, "optional": true }, + "node_modules/nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -11847,6 +11981,111 @@ "node": ">=0.10.0" } }, + "node_modules/postcss": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", + "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "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-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", @@ -12232,6 +12471,14 @@ "react": "^16.14.0" } }, + "node_modules/react-hooks-helper": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-hooks-helper/-/react-hooks-helper-1.6.0.tgz", + "integrity": "sha512-DlyWQ99tgwyDdJfTihCXT6AftYymxhA2LS60vBCTOpclmjPxqDwDTLjVK0kbIc3XsgJvxkanW8TwHE0jrIB8hA==", + "peerDependencies": { + "react": "^16.8.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -13815,6 +14062,58 @@ "node": ">=0.10.0" } }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/sudo-prompt": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", @@ -14682,10 +14981,8 @@ "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, "dependencies": { - "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" + "neo-async": "^2.5.0" }, "optionalDependencies": { "chokidar": "^3.4.1", @@ -14747,7 +15044,6 @@ "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", - "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", @@ -15092,7 +15388,6 @@ "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", - "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", @@ -20987,6 +21282,79 @@ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" }, + "css-loader": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.4.tgz", + "integrity": "sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw==", + "dev": true, + "requires": { + "camelcase": "^6.2.0", + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.10", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.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" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "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" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", @@ -21005,6 +21373,12 @@ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "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 + }, "csstype": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", @@ -22629,6 +23003,13 @@ "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": {} + }, "idb": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/idb/-/idb-5.0.6.tgz", @@ -24351,7 +24732,6 @@ "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", "peer": true, "requires": { - "@babel/core": "^7.0.0", "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", @@ -24398,7 +24778,6 @@ "integrity": "sha512-K1sHO3ODBFCr7uEiCQ4RvVr+cQg0EHQF8ChVPnecGh/WDD8udrTq9ECwB0dRfMjAvlsHtRUlJm6ZSI8UPgum2w==", "peer": true, "requires": { - "@babel/core": "^7.0.0", "babel-preset-fbjs": "^3.3.0", "metro-babel-transformer": "0.64.0", "metro-react-native-babel-preset": "0.64.0", @@ -24658,6 +25037,12 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -25425,6 +25810,77 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, + "postcss": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", + "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "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 + } + } + }, + "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-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, "pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", @@ -25748,6 +26204,12 @@ "scheduler": "^0.19.1" } }, + "react-hooks-helper": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-hooks-helper/-/react-hooks-helper-1.6.0.tgz", + "integrity": "sha512-DlyWQ99tgwyDdJfTihCXT6AftYymxhA2LS60vBCTOpclmjPxqDwDTLjVK0kbIc3XsgJvxkanW8TwHE0jrIB8hA==", + "requires": {} + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -27078,6 +27540,40 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "sudo-prompt": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", diff --git a/clients/web/react/package.json b/clients/web/react/package.json index 5ea818a..f394b5d 100755 --- a/clients/web/react/package.json +++ b/clients/web/react/package.json @@ -17,6 +17,7 @@ "react": "^16.14.0", "react-bootstrap": "^1.4.0", "react-dom": "^16.14.0", + "react-hooks-helper": "^1.6.0", "react-redux": "^7.2.2", "react-router-dom": "^5.2.0", "redux": "^4.0.5", @@ -31,8 +32,10 @@ "@babel/preset-react": "^7.12.1", "@babel/runtime": "^7.12.1", "babel-loader": "^8.1.0", + "css-loader": "^5.2.4", "html-webpack-plugin": "^3.2.0", "path": "^0.12.7", + "style-loader": "^2.0.0", "webpack": "^4.44.2", "webpack-cli": "^3.3.12", "webpack-dev-server": "^3.11.0" diff --git a/clients/web/react/src/App/App.jsx b/clients/web/react/src/App/App.jsx index 9f09d76..0d798e4 100644 --- a/clients/web/react/src/App/App.jsx +++ b/clients/web/react/src/App/App.jsx @@ -10,6 +10,7 @@ import { HomePage } from '../HomePage'; import { LoginPage } from '../LoginPage'; import { LoginWithSecurityKeyPage } from '../LoginWithSecurityKeyPage'; import { RegisterPage } from '../RegisterPage'; +import { IdentifierFirstFlowProto } from '../IdentifierFirstFlowProto'; import Amplify from 'aws-amplify'; import aws_exports from '../aws-exports'; @@ -42,6 +43,7 @@ function App() { + diff --git a/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx b/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx new file mode 100755 index 0000000..b374770 --- /dev/null +++ b/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx @@ -0,0 +1,75 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { Button, Row, Col } from 'react-bootstrap'; + +import { userActions } from '../_actions'; +import { history } from '../_helpers'; +import validate from 'validate.js'; + +import { IdentifierFirstFlow } from '../_components'; + +function IdentifierFirstFlowProto() { + const [inputs, setInputs] = useState({ + username: '' + }); + const [submitted, setSubmitted] = useState(false); + const [invalidUsername, setInvalidUsername] = useState(undefined); + const { username } = inputs; + const loggingIn = useSelector(state => state.authentication.loggingIn); + const dispatch = useDispatch(); + var constraints = { + username: { + presence: true, + format: { + pattern: "[a-z0-9_\-]+", + flags: "i", + message: "can only contain a-z, 0-9, or _-" + }, + length: { + minimum: 3, + maximum: 20 + } + } + }; + + // reset login status + useEffect(() => { + dispatch(userActions.logout()); + }, []); + + function handleChange(e) { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + } + + function handleSubmit(e) { + e.preventDefault(); + + setSubmitted(true); + + const result = validate({username: username}, constraints) + if(result){ + console.error("invalid username: ", result); + setInvalidUsername(result.username.join(". ")); + return; + } else { + setInvalidUsername(undefined); + } + + dispatch(userActions.exists(username.toLocaleLowerCase())); + + } + + function handleLoginWithoutUsername() { + localStorage.removeItem('username'); + history.push('/loginWithSecurityKey'); + } + + return ( + <> + + + ); +} + +export { IdentifierFirstFlowProto }; \ No newline at end of file diff --git a/clients/web/react/src/IdentifierFirstFlowProto/index.js b/clients/web/react/src/IdentifierFirstFlowProto/index.js new file mode 100644 index 0000000..0362eb4 --- /dev/null +++ b/clients/web/react/src/IdentifierFirstFlowProto/index.js @@ -0,0 +1 @@ +export * from './IdentifierFirstFlowProto'; \ No newline at end of file diff --git a/clients/web/react/src/_components/ForgotStep.js b/clients/web/react/src/_components/ForgotStep.js new file mode 100644 index 0000000..f51d5a7 --- /dev/null +++ b/clients/web/react/src/_components/ForgotStep.js @@ -0,0 +1,47 @@ +import React from "react"; +import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const ForgotStep = ({ setForm, formData, navigation }) => { + const loginStep = () => { + navigation.go('LoginStep'); + } + + return ( + <> +
+ YubicoLabs +
+

Forgot Your Security Key?

+ +
+
+
+ + + Recovery Code + + + +
+
+ +
+
+
+
+
+
Back to Log In
+
+
+
+ + ); +}; + +export default ForgotStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/IdentifierFirstFlow.jsx b/clients/web/react/src/_components/IdentifierFirstFlow.jsx new file mode 100644 index 0000000..322639b --- /dev/null +++ b/clients/web/react/src/_components/IdentifierFirstFlow.jsx @@ -0,0 +1,64 @@ +import React from "react"; +import { useForm, useStep } from "react-hooks-helper"; + +import LoginStep from "./LoginStep"; +import SignUpStep from "./SignUpStep"; +import RegisterSvPinStep from "./RegisterSvPinStep"; +import ForgotStep from "./ForgotStep"; +import PromptSvPinStep from "./PromptSvPinStep"; +import RegisterTrustedDeviceStep from "./RegisterTrustedDeviceStep"; + +const steps = [ + { id: "LoginStep" }, + { id: "SignUpStep" }, + { id: "RegisterSvPinStep" }, + { id: "ForgotStep" }, + { id: "PromptSvPinStep" }, + { id: "RegisterTrustedDeviceStep" } +]; + +const defaultData = { + firstName: "Jane", + lastName: "Doe", + nickName: "Jan", + address: "200 South Main St", + city: "Anytown", + state: "CA", + zip: "90505", + email: "email@domain.com", + phone: "+61 4252 454 332" +}; + +export const IdentifierFirstFlow = ({ images }) => { + const [formData, setForm] = useForm(defaultData); + const { step, navigation } = useStep({ initialStep: 0, steps }); + const { id } = step; + + const props = { formData, setForm, navigation }; + + const renderSwitch = (id) => { + switch (id) { + case "LoginStep": + return ; + case "SignUpStep": + return ; + case "RegisterSvPinStep": + return ; + case "ForgotStep": + return ; + case "PromptSvPinStep": + return ; + case "RegisterTrustedDeviceStep": + return ; + default: + return null; + } + }; + + return ( + <> + {renderSwitch(id)} + + ); + +} \ No newline at end of file diff --git a/clients/web/react/src/_components/LoginStep.js b/clients/web/react/src/_components/LoginStep.js new file mode 100644 index 0000000..53e9c64 --- /dev/null +++ b/clients/web/react/src/_components/LoginStep.js @@ -0,0 +1,61 @@ +import React from "react"; +import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const LoginStep = ({ setForm, formData, navigation }) => { + + const promptSvPinStep = () => { + navigation.go('PromptSvPinStep'); + } + const signUpStep = () => { + navigation.go('SignUpStep'); + } + const forgotStep = () => { + navigation.go('ForgotStep'); + } + + return ( + <> +
+ YubicoLabs +
+

Welcome

+ +
+
+
+ + + @ + + + +
+
Forgot Your Security Key?
+
+ +
+
+ OR +
+
+ +
+
+
+
+
+
Don't have an account? Sign Up
+
+
+
+ + ); +}; + +export default LoginStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/PromptSvPinStep.js b/clients/web/react/src/_components/PromptSvPinStep.js new file mode 100644 index 0000000..26672e7 --- /dev/null +++ b/clients/web/react/src/_components/PromptSvPinStep.js @@ -0,0 +1,50 @@ +import React from "react"; +import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const PromptSvPinStep = ({ setForm, formData, navigation }) => { + const LoginStep = () => { + navigation.go('LoginStep'); + } + const registerTrustedDeviceStep = () => { + navigation.go('RegisterTrustedDeviceStep'); + } + + return ( + <> +
+ YubicoLabs +
+

Welcome

+ +
+
+
+ + + Server Verified PIN + + + +
+
+ +
+
+
+
+
+
Try Another Method
+
+
+
+ + ); +}; + +export default PromptSvPinStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/RegisterSvPinStep.js b/clients/web/react/src/_components/RegisterSvPinStep.js new file mode 100644 index 0000000..5da8aff --- /dev/null +++ b/clients/web/react/src/_components/RegisterSvPinStep.js @@ -0,0 +1,57 @@ +import React from "react"; +import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const RegisterSvPinStep = ({ setForm, formData, navigation }) => { + const LoginStep = () => { + navigation.go('LoginStep'); + } + + return ( + <> +
+ YubicoLabs +
+

Welcome

+ +
+
+
+ + + Server Verified PIN + + + + + + Confirm PIN             + + + +
+
+ +
+
+
+
+
+
Already have an account? Log In
+
+
+
+ + ); +}; + +export default RegisterSvPinStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js new file mode 100644 index 0000000..fbcd7a2 --- /dev/null +++ b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js @@ -0,0 +1,58 @@ +import React from "react"; +import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { + + const loginStep = (step) => { + navigation.go('LoginStep'); + } + const registerSvPinStep = (step) => { + navigation.go('RegisterSvPinStep'); + } + + return ( + <> +
+ YubicoLabs +
+

Log In Faster on This Device

+ +
+
+
+ + +   Device Name + + + +
+
+ +
+
+ +
+
+
+
+
+ Don't want to register this device? +
    +
  • Ask me later
  • +
  • Never ask me to register this device
  • +
+
+
+
+ + ); +}; + +export default RegisterTrustedDeviceStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/SignUpStep.js b/clients/web/react/src/_components/SignUpStep.js new file mode 100644 index 0000000..b4d2cb0 --- /dev/null +++ b/clients/web/react/src/_components/SignUpStep.js @@ -0,0 +1,61 @@ +import React from "react"; +import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const SignUpStep = ({ setForm, formData, navigation }) => { + + const loginStep = (step) => { + navigation.go('LoginStep'); + } + const registerSvPinStep = (step) => { + navigation.go('RegisterSvPinStep'); + } + + return ( + <> +
+ YubicoLabs +
+

Welcome

+ +
+
+
+ + + @ + + + + + + + + + +
+
+ +
+
+
+
+
+
Already have an account? Log In
+
+
+
+ + ); +}; + +export default SignUpStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/component.module.css b/clients/web/react/src/_components/component.module.css new file mode 100644 index 0000000..5e6072c --- /dev/null +++ b/clients/web/react/src/_components/component.module.css @@ -0,0 +1,26 @@ +.text-divider { + display: flex; + align-items: center; + --text-divider-gap: 1rem; +} + +.text-divider::before, +.text-divider::after { + content: ''; + height: 1px; + background-color: silver; + flex-grow: 1; +} + +.text-divider::before { + margin-right: var(--text-divider-gap); +} + +.text-divider::after { + margin-left: var(--text-divider-gap); +} + +.rcorners { + border-radius: 25px; + background-color: white; +} \ No newline at end of file diff --git a/clients/web/react/src/_components/index.js b/clients/web/react/src/_components/index.js index 74db41a..ac15b75 100644 --- a/clients/web/react/src/_components/index.js +++ b/clients/web/react/src/_components/index.js @@ -1,2 +1,3 @@ export * from './PrivateRoute'; export * from './ServerVerifiedPin'; +export * from './IdentifierFirstFlow'; \ No newline at end of file diff --git a/clients/web/react/webpack.config.js b/clients/web/react/webpack.config.js index 8f47298..2a81aec 100755 --- a/clients/web/react/webpack.config.js +++ b/clients/web/react/webpack.config.js @@ -10,6 +10,10 @@ module.exports = { { test: /\.jsx?$/, loader: 'babel-loader', + }, + { + test: /\.css$/, + use: [ 'style-loader', 'css-loader' ] } ] }, From ff79bcb1ce3a1ab7b32173d5067d16dce5e9f619 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Mon, 24 May 2021 09:51:53 -0700 Subject: [PATCH 05/66] add trusted device login step --- .../web/react/src/_components/ForgotStep.js | 6 +-- .../src/_components/IdentifierFirstFlow.jsx | 14 ++++--- .../src/_components/LogInTrustedDeviceStep.js | 40 +++++++++++++++++++ .../web/react/src/_components/LoginStep.js | 9 +++-- .../react/src/_components/PromptSvPinStep.js | 6 +-- .../src/_components/RegisterSvPinStep.js | 6 +-- .../_components/RegisterTrustedDeviceStep.js | 4 +- .../web/react/src/_components/SignUpStep.js | 6 +-- 8 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 clients/web/react/src/_components/LogInTrustedDeviceStep.js diff --git a/clients/web/react/src/_components/ForgotStep.js b/clients/web/react/src/_components/ForgotStep.js index f51d5a7..474ca1a 100644 --- a/clients/web/react/src/_components/ForgotStep.js +++ b/clients/web/react/src/_components/ForgotStep.js @@ -4,8 +4,8 @@ import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; import styles from "./component.module.css"; const ForgotStep = ({ setForm, formData, navigation }) => { - const loginStep = () => { - navigation.go('LoginStep'); + const LogInStep = () => { + navigation.go('LogInStep'); } return ( @@ -36,7 +36,7 @@ const ForgotStep = ({ setForm, formData, navigation }) => {
-
Back to Log In
+
Back to Log In
diff --git a/clients/web/react/src/_components/IdentifierFirstFlow.jsx b/clients/web/react/src/_components/IdentifierFirstFlow.jsx index 322639b..c216d71 100644 --- a/clients/web/react/src/_components/IdentifierFirstFlow.jsx +++ b/clients/web/react/src/_components/IdentifierFirstFlow.jsx @@ -1,20 +1,22 @@ import React from "react"; import { useForm, useStep } from "react-hooks-helper"; -import LoginStep from "./LoginStep"; +import LogInStep from "./LogInStep"; import SignUpStep from "./SignUpStep"; import RegisterSvPinStep from "./RegisterSvPinStep"; import ForgotStep from "./ForgotStep"; import PromptSvPinStep from "./PromptSvPinStep"; import RegisterTrustedDeviceStep from "./RegisterTrustedDeviceStep"; +import LogInTrustedDeviceStep from "./LogInTrustedDeviceStep"; const steps = [ - { id: "LoginStep" }, + { id: "LogInStep" }, { id: "SignUpStep" }, { id: "RegisterSvPinStep" }, { id: "ForgotStep" }, { id: "PromptSvPinStep" }, - { id: "RegisterTrustedDeviceStep" } + { id: "RegisterTrustedDeviceStep" }, + { id: "LogInTrustedDeviceStep" } ]; const defaultData = { @@ -38,8 +40,8 @@ export const IdentifierFirstFlow = ({ images }) => { const renderSwitch = (id) => { switch (id) { - case "LoginStep": - return ; + case "LogInStep": + return ; case "SignUpStep": return ; case "RegisterSvPinStep": @@ -50,6 +52,8 @@ export const IdentifierFirstFlow = ({ images }) => { return ; case "RegisterTrustedDeviceStep": return ; + case "LogInTrustedDeviceStep": + return ; default: return null; } diff --git a/clients/web/react/src/_components/LogInTrustedDeviceStep.js b/clients/web/react/src/_components/LogInTrustedDeviceStep.js new file mode 100644 index 0000000..c81e630 --- /dev/null +++ b/clients/web/react/src/_components/LogInTrustedDeviceStep.js @@ -0,0 +1,40 @@ +import React from "react"; +import { Button, Label } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const LogInTrustedDeviceStep = ({ setForm, formData, navigation }) => { + + const LogInStep = () => { + navigation.go('LogInStep'); + } + + + return ( + <> +
+ YubicoLabs +
+

Welcome

+ +
+
+
+
+
+
+ +
+
+
+
+
+
Try Another Method
+
+
+
+ + ); +}; + +export default LogInTrustedDeviceStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/LoginStep.js b/clients/web/react/src/_components/LoginStep.js index 53e9c64..400a0c5 100644 --- a/clients/web/react/src/_components/LoginStep.js +++ b/clients/web/react/src/_components/LoginStep.js @@ -3,7 +3,7 @@ import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; import styles from "./component.module.css"; -const LoginStep = ({ setForm, formData, navigation }) => { +const LogInStep = ({ setForm, formData, navigation }) => { const promptSvPinStep = () => { navigation.go('PromptSvPinStep'); @@ -14,6 +14,9 @@ const LoginStep = ({ setForm, formData, navigation }) => { const forgotStep = () => { navigation.go('ForgotStep'); } + const logInTrustedDeviceStep = () => { + navigation.go('LogInTrustedDeviceStep'); + } return ( <> @@ -44,7 +47,7 @@ const LoginStep = ({ setForm, formData, navigation }) => { OR
- +

@@ -58,4 +61,4 @@ const LoginStep = ({ setForm, formData, navigation }) => { ); }; -export default LoginStep; \ No newline at end of file +export default LogInStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/PromptSvPinStep.js b/clients/web/react/src/_components/PromptSvPinStep.js index 26672e7..17b5667 100644 --- a/clients/web/react/src/_components/PromptSvPinStep.js +++ b/clients/web/react/src/_components/PromptSvPinStep.js @@ -4,8 +4,8 @@ import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; import styles from "./component.module.css"; const PromptSvPinStep = ({ setForm, formData, navigation }) => { - const LoginStep = () => { - navigation.go('LoginStep'); + const LogInStep = () => { + navigation.go('LogInStep'); } const registerTrustedDeviceStep = () => { navigation.go('RegisterTrustedDeviceStep'); @@ -39,7 +39,7 @@ const PromptSvPinStep = ({ setForm, formData, navigation }) => {
-
Try Another Method
+
Try Another Method
diff --git a/clients/web/react/src/_components/RegisterSvPinStep.js b/clients/web/react/src/_components/RegisterSvPinStep.js index 5da8aff..b392ed7 100644 --- a/clients/web/react/src/_components/RegisterSvPinStep.js +++ b/clients/web/react/src/_components/RegisterSvPinStep.js @@ -4,8 +4,8 @@ import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; import styles from "./component.module.css"; const RegisterSvPinStep = ({ setForm, formData, navigation }) => { - const LoginStep = () => { - navigation.go('LoginStep'); + const LogInStep = () => { + navigation.go('LogInStep'); } return ( @@ -46,7 +46,7 @@ const RegisterSvPinStep = ({ setForm, formData, navigation }) => {
-
Already have an account? Log In
+
Already have an account? Log In
diff --git a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js index fbcd7a2..6b69ccf 100644 --- a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js +++ b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js @@ -5,8 +5,8 @@ import styles from "./component.module.css"; const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { - const loginStep = (step) => { - navigation.go('LoginStep'); + const LogInStep = (step) => { + navigation.go('LogInStep'); } const registerSvPinStep = (step) => { navigation.go('RegisterSvPinStep'); diff --git a/clients/web/react/src/_components/SignUpStep.js b/clients/web/react/src/_components/SignUpStep.js index b4d2cb0..2f7c76a 100644 --- a/clients/web/react/src/_components/SignUpStep.js +++ b/clients/web/react/src/_components/SignUpStep.js @@ -5,8 +5,8 @@ import styles from "./component.module.css"; const SignUpStep = ({ setForm, formData, navigation }) => { - const loginStep = (step) => { - navigation.go('LoginStep'); + const LogInStep = (step) => { + navigation.go('LogInStep'); } const registerSvPinStep = (step) => { navigation.go('RegisterSvPinStep'); @@ -50,7 +50,7 @@ const SignUpStep = ({ setForm, formData, navigation }) => {
-
Already have an account? Log In
+
Already have an account? Log In
From 3bffb310dd26273ff916a5a26dc90dd53af47798 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Tue, 25 May 2021 18:11:21 -0700 Subject: [PATCH 06/66] add registration success steps --- .../src/_components/IdentifierFirstFlow.jsx | 32 +++-- .../src/_components/LogInTrustedDeviceStep.js | 2 +- .../_components/RegisterDeviceSuccessStep.js | 38 ++++++ .../src/_components/RegisterKeySuccessStep.js | 43 ++++++ .../src/_components/RegisterSvPinStep.js | 10 +- .../_components/RegisterTrustedDeviceStep.js | 34 ++--- .../web/react/src/_components/SignUpStep.js | 122 ++++++++++++++---- 7 files changed, 208 insertions(+), 73 deletions(-) create mode 100644 clients/web/react/src/_components/RegisterDeviceSuccessStep.js create mode 100644 clients/web/react/src/_components/RegisterKeySuccessStep.js diff --git a/clients/web/react/src/_components/IdentifierFirstFlow.jsx b/clients/web/react/src/_components/IdentifierFirstFlow.jsx index c216d71..29da8d1 100644 --- a/clients/web/react/src/_components/IdentifierFirstFlow.jsx +++ b/clients/web/react/src/_components/IdentifierFirstFlow.jsx @@ -1,5 +1,5 @@ import React from "react"; -import { useForm, useStep } from "react-hooks-helper"; +import { useStep } from "react-hooks-helper"; import LogInStep from "./LogInStep"; import SignUpStep from "./SignUpStep"; @@ -8,6 +8,8 @@ import ForgotStep from "./ForgotStep"; import PromptSvPinStep from "./PromptSvPinStep"; import RegisterTrustedDeviceStep from "./RegisterTrustedDeviceStep"; import LogInTrustedDeviceStep from "./LogInTrustedDeviceStep"; +import RegisterKeySuccessStep from "./RegisterKeySuccessStep"; +import RegisterDeviceSuccessStep from "./RegisterDeviceSuccessStep"; const steps = [ { id: "LogInStep" }, @@ -16,27 +18,19 @@ const steps = [ { id: "ForgotStep" }, { id: "PromptSvPinStep" }, { id: "RegisterTrustedDeviceStep" }, - { id: "LogInTrustedDeviceStep" } + { id: "LogInTrustedDeviceStep" }, + { id: "RegisterKeySuccessStep" }, + { id: "RegisterDeviceSuccessStep" } ]; -const defaultData = { - firstName: "Jane", - lastName: "Doe", - nickName: "Jan", - address: "200 South Main St", - city: "Anytown", - state: "CA", - zip: "90505", - email: "email@domain.com", - phone: "+61 4252 454 332" -}; - export const IdentifierFirstFlow = ({ images }) => { - const [formData, setForm] = useForm(defaultData); - const { step, navigation } = useStep({ initialStep: 0, steps }); + let trustedDevice = localStorage.getItem('trustedDevice'); + const _initialStep = trustedDevice === "true" ? 6 : 0; + const { step, navigation } = useStep({ initialStep: _initialStep, steps }); + const { id } = step; - const props = { formData, setForm, navigation }; + const props = { navigation }; const renderSwitch = (id) => { switch (id) { @@ -54,6 +48,10 @@ export const IdentifierFirstFlow = ({ images }) => { return ; case "LogInTrustedDeviceStep": return ; + case "RegisterKeySuccessStep": + return ; + case "RegisterDeviceSuccessStep": + return ; default: return null; } diff --git a/clients/web/react/src/_components/LogInTrustedDeviceStep.js b/clients/web/react/src/_components/LogInTrustedDeviceStep.js index c81e630..1fbf16f 100644 --- a/clients/web/react/src/_components/LogInTrustedDeviceStep.js +++ b/clients/web/react/src/_components/LogInTrustedDeviceStep.js @@ -20,7 +20,7 @@ const LogInTrustedDeviceStep = ({ setForm, formData, navigation }) => {
-
+
diff --git a/clients/web/react/src/_components/RegisterDeviceSuccessStep.js b/clients/web/react/src/_components/RegisterDeviceSuccessStep.js new file mode 100644 index 0000000..1162b6d --- /dev/null +++ b/clients/web/react/src/_components/RegisterDeviceSuccessStep.js @@ -0,0 +1,38 @@ +import React from "react"; +import { Button, InputGroup, FormControl, } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const RegisterDeviceSuccessStep = ({ setForm, formData, navigation }) => { + + return ( + <> +
+ YubicoLabs +
+

Device Added

+ +
+
+
+ + + + + + +
+
+ +
+
+
+ + ); +}; + +export default RegisterDeviceSuccessStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/RegisterKeySuccessStep.js b/clients/web/react/src/_components/RegisterKeySuccessStep.js new file mode 100644 index 0000000..79b8610 --- /dev/null +++ b/clients/web/react/src/_components/RegisterKeySuccessStep.js @@ -0,0 +1,43 @@ +import React from "react"; +import { Button, InputGroup, FormControl, } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { + + const registerSvPinStep = () => { + navigation.go('RegisterSvPinStep'); + } + + return ( + <> +
+ YubicoLabs +
+

Security Key Added

+ +
+
+
+ + + + + + + +
+
+ +
+
+
+ + ); +}; + +export default RegisterKeySuccessStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/RegisterSvPinStep.js b/clients/web/react/src/_components/RegisterSvPinStep.js index b392ed7..f4c1b15 100644 --- a/clients/web/react/src/_components/RegisterSvPinStep.js +++ b/clients/web/react/src/_components/RegisterSvPinStep.js @@ -13,8 +13,8 @@ const RegisterSvPinStep = ({ setForm, formData, navigation }) => {
YubicoLabs
-

Welcome

- +

Create your Server-Verified PIN

+
@@ -42,12 +42,6 @@ const RegisterSvPinStep = ({ setForm, formData, navigation }) => {
-
-
-
-
-
Already have an account? Log In
-
diff --git a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js index 6b69ccf..317528a 100644 --- a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js +++ b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js @@ -1,15 +1,21 @@ -import React from "react"; +import React, { useState, useEffect, useRef } from 'react'; import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; import styles from "./component.module.css"; const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { - const LogInStep = (step) => { - navigation.go('LogInStep'); + const setTrustedDevice = (value) => { + localStorage.setItem('trustedDevice', value); } - const registerSvPinStep = (step) => { - navigation.go('RegisterSvPinStep'); + + const registerDeviceSuccessStep = () => { + navigation.go('RegisterDeviceSuccessStep'); + } + + const next = () => { + setTrustedDevice(true); + registerDeviceSuccessStep(); } return ( @@ -22,22 +28,10 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => {
- - -   Device Name - - - -
-
- +
- +

@@ -46,7 +40,7 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { Don't want to register this device?
  • Ask me later
  • -
  • Never ask me to register this device
  • +
  • setTrustedDevice(false)} className="btn-link">Never ask me to register this device
diff --git a/clients/web/react/src/_components/SignUpStep.js b/clients/web/react/src/_components/SignUpStep.js index 2f7c76a..377d67f 100644 --- a/clients/web/react/src/_components/SignUpStep.js +++ b/clients/web/react/src/_components/SignUpStep.js @@ -1,17 +1,79 @@ -import React from "react"; -import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; +import validate from 'validate.js'; import styles from "./component.module.css"; const SignUpStep = ({ setForm, formData, navigation }) => { + const [inputs, setInputs] = useState({ + username: '' + }); + const [errors, setErrors] = useState({ + username: '' + }); + const [validated, setValidated] = useState(false); + + const constraints = { + username: { + presence: true, + format: { + pattern: "[a-z0-9_\-]+", + flags: "i", + message: "can only contain a-z, 0-9, or _-" + }, + length: { + minimum: 3, + maximum: 20 + } + } + }; + const LogInStep = (step) => { navigation.go('LogInStep'); } - const registerSvPinStep = (step) => { - navigation.go('RegisterSvPinStep'); + const registerKeySuccessStep = (step) => { + navigation.go('RegisterKeySuccessStep'); + } + + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + const result = validate({ username: value }, constraints); + if (result) { + setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); + setValidated(false); + return; + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + setValidated(true); + } } + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + setValidated(true); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + if(isUsernameValid()) { + registerKeySuccessStep(); + } + } + + const isUsernameValid = () => { + if(validate({ username: inputs.username }, constraints)){ + return false; + } + return true; +} + return ( <>
@@ -20,38 +82,44 @@ const SignUpStep = ({ setForm, formData, navigation }) => {

Welcome

-
-
- +
+ + @ + + {errors.username} + - - - - - - -
-
- -
-
-
-
-
-
Already have an account? Log In
-
+ +
+

Add Your Security Key

+ +
+
    +
  1. Make sure your Security Key is nearby
  2. +
  3. Follow the steps in the browser
  4. +
  5. Give your Security Key a nickname to easily identify it later
  6. +
+ + +
+
+
+
+
Already have an account? Log In
From eb29bef249ef0486f4293be5a05ea47d01c43929 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Wed, 26 May 2021 15:16:07 -0700 Subject: [PATCH 07/66] Add account security prototype --- .../src/_components/AccountSecurityStep.js | 128 ++++++++++++++++++ .../web/react/src/_components/ForgotStep.js | 8 +- .../src/_components/IdentifierFirstFlow.jsx | 15 +- .../src/_components/LogInTrustedDeviceStep.js | 9 +- .../web/react/src/_components/LoginStep.js | 125 +++++++++++++---- .../react/src/_components/PromptSvPinStep.js | 3 - .../_components/RegisterDeviceSuccessStep.js | 8 +- .../src/_components/RegisterKeySuccessStep.js | 3 - .../src/_components/RegisterSvPinStep.js | 9 +- .../_components/RegisterTrustedDeviceStep.js | 14 +- .../web/react/src/_components/SignUpStep.js | 3 - 11 files changed, 261 insertions(+), 64 deletions(-) create mode 100644 clients/web/react/src/_components/AccountSecurityStep.js diff --git a/clients/web/react/src/_components/AccountSecurityStep.js b/clients/web/react/src/_components/AccountSecurityStep.js new file mode 100644 index 0000000..25084e3 --- /dev/null +++ b/clients/web/react/src/_components/AccountSecurityStep.js @@ -0,0 +1,128 @@ +import React from "react"; +import { Button, Card, InputGroup, FormControl, Table } from 'react-bootstrap'; + +import styles from "./component.module.css"; + +const AccountSecurityStep = ({ setForm, formData, navigation }) => { + const logOut = () => { + window.location.reload(); + } + + return ( + <> +
+

Account Security

+
+
+ +
Trusted Devices
+ + + + + + + + + + + + + + + + + + + +
Safari on macOS. Registered: May 26, 2021
Safari on macOS. Registered: April 26, 2021
Safari on macOS. Registered: March 26, 2021
+
+
+ +
Security Keys
+ + + + + + + + + + + + + + + + + + + +
YubiKey 5. Last used: May 26, 2021
YubiKey 4. Last used: April 26, 2021
YubiKey 6. Last used: March 26, 2021
+ +
+
+ +
Server Verified PIN
+ + + + Old PIN         + + + + + + New PIN       + + + + + + Confirm PIN + + + + + +
+ +
Recovery Options
+ + + +
+ +
Delete Account
+ + + +
+
+
+
+
+
Log Out
+
+
+ + ); +}; + +export default AccountSecurityStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/ForgotStep.js b/clients/web/react/src/_components/ForgotStep.js index 474ca1a..797a9c1 100644 --- a/clients/web/react/src/_components/ForgotStep.js +++ b/clients/web/react/src/_components/ForgotStep.js @@ -7,11 +7,12 @@ const ForgotStep = ({ setForm, formData, navigation }) => { const LogInStep = () => { navigation.go('LogInStep'); } + const accountSecurityStep = () => { + navigation.go('AccountSecurityStep'); + } return ( <> -
- YubicoLabs

Forgot Your Security Key?

@@ -30,7 +31,7 @@ const ForgotStep = ({ setForm, formData, navigation }) => {
- +

@@ -39,7 +40,6 @@ const ForgotStep = ({ setForm, formData, navigation }) => {
Back to Log In
-
); }; diff --git a/clients/web/react/src/_components/IdentifierFirstFlow.jsx b/clients/web/react/src/_components/IdentifierFirstFlow.jsx index 29da8d1..cfd2995 100644 --- a/clients/web/react/src/_components/IdentifierFirstFlow.jsx +++ b/clients/web/react/src/_components/IdentifierFirstFlow.jsx @@ -1,4 +1,5 @@ import React from "react"; +import { Card } from 'react-bootstrap'; import { useStep } from "react-hooks-helper"; import LogInStep from "./LogInStep"; @@ -10,6 +11,7 @@ import RegisterTrustedDeviceStep from "./RegisterTrustedDeviceStep"; import LogInTrustedDeviceStep from "./LogInTrustedDeviceStep"; import RegisterKeySuccessStep from "./RegisterKeySuccessStep"; import RegisterDeviceSuccessStep from "./RegisterDeviceSuccessStep"; +import AccountSecurityStep from "./AccountSecurityStep"; const steps = [ { id: "LogInStep" }, @@ -20,7 +22,8 @@ const steps = [ { id: "RegisterTrustedDeviceStep" }, { id: "LogInTrustedDeviceStep" }, { id: "RegisterKeySuccessStep" }, - { id: "RegisterDeviceSuccessStep" } + { id: "RegisterDeviceSuccessStep" }, + { id: "AccountSecurityStep" } ]; export const IdentifierFirstFlow = ({ images }) => { @@ -52,6 +55,8 @@ export const IdentifierFirstFlow = ({ images }) => { return ; case "RegisterDeviceSuccessStep": return ; + case "AccountSecurityStep": + return ; default: return null; } @@ -59,7 +64,13 @@ export const IdentifierFirstFlow = ({ images }) => { return ( <> - {renderSwitch(id)} + + + YubicoLabs + {renderSwitch(id)} + + + ); diff --git a/clients/web/react/src/_components/LogInTrustedDeviceStep.js b/clients/web/react/src/_components/LogInTrustedDeviceStep.js index 1fbf16f..c924ac5 100644 --- a/clients/web/react/src/_components/LogInTrustedDeviceStep.js +++ b/clients/web/react/src/_components/LogInTrustedDeviceStep.js @@ -8,12 +8,14 @@ const LogInTrustedDeviceStep = ({ setForm, formData, navigation }) => { const LogInStep = () => { navigation.go('LogInStep'); } + + const accountSecurityStep = () => { + navigation.go('AccountSecurityStep'); + } return ( <> -
- YubicoLabs

Welcome

@@ -23,7 +25,7 @@ const LogInTrustedDeviceStep = ({ setForm, formData, navigation }) => {
- +

@@ -32,7 +34,6 @@ const LogInTrustedDeviceStep = ({ setForm, formData, navigation }) => {
Try Another Method
-
); }; diff --git a/clients/web/react/src/_components/LoginStep.js b/clients/web/react/src/_components/LoginStep.js index 400a0c5..be97699 100644 --- a/clients/web/react/src/_components/LoginStep.js +++ b/clients/web/react/src/_components/LoginStep.js @@ -1,9 +1,32 @@ -import React from "react"; -import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, Form } from 'react-bootstrap'; +import validate from 'validate.js'; import styles from "./component.module.css"; -const LogInStep = ({ setForm, formData, navigation }) => { +const LogInStep = ({ navigation }) => { + const [inputs, setInputs] = useState({ + username: localStorage.getItem('username') + }); + const [errors, setErrors] = useState({ + username: '' + }); + const [validated, setValidated] = useState(false); + + const constraints = { + username: { + presence: true, + format: { + pattern: "[a-z0-9_\-]+", + flags: "i", + message: "can only contain a-z, 0-9, or _-" + }, + length: { + minimum: 3, + maximum: 20 + } + } + }; const promptSvPinStep = () => { navigation.go('PromptSvPinStep'); @@ -14,49 +37,93 @@ const LogInStep = ({ setForm, formData, navigation }) => { const forgotStep = () => { navigation.go('ForgotStep'); } - const logInTrustedDeviceStep = () => { - navigation.go('LogInTrustedDeviceStep'); + const accountSecurityStep = () => { + navigation.go('AccountSecurityStep'); + } + + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + setValidated(false); + + const result = validate({ username: value }, constraints); + if (result) { + setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); + return; + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } + + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + if(isUsernameValid()) { + setValidated(true); + promptSvPinStep(); + } else { + setValidated(false); + } + } + + const isUsernameValid = () => { + if(validate({ username: inputs.username }, constraints)){ + return false; + } + return true; } + return ( <> -
- YubicoLabs

Welcome

-
-
- +
+ + @ - + + {errors.username} + -
-
Forgot Your Security Key?
-
- -
-
- OR -
-
- -
-
-
-
-
-
Don't have an account? Sign Up
-
+ +
Forgot Your Security Key?
+ + +
+ OR +
+
+ +
+
+
+
+
+
Don't have an account? Sign Up
-
); }; diff --git a/clients/web/react/src/_components/PromptSvPinStep.js b/clients/web/react/src/_components/PromptSvPinStep.js index 17b5667..ea44a8c 100644 --- a/clients/web/react/src/_components/PromptSvPinStep.js +++ b/clients/web/react/src/_components/PromptSvPinStep.js @@ -13,8 +13,6 @@ const PromptSvPinStep = ({ setForm, formData, navigation }) => { return ( <> -
- YubicoLabs

Welcome

@@ -42,7 +40,6 @@ const PromptSvPinStep = ({ setForm, formData, navigation }) => {
Try Another Method
- ); }; diff --git a/clients/web/react/src/_components/RegisterDeviceSuccessStep.js b/clients/web/react/src/_components/RegisterDeviceSuccessStep.js index 1162b6d..076b959 100644 --- a/clients/web/react/src/_components/RegisterDeviceSuccessStep.js +++ b/clients/web/react/src/_components/RegisterDeviceSuccessStep.js @@ -4,11 +4,12 @@ import { Button, InputGroup, FormControl, } from 'react-bootstrap'; import styles from "./component.module.css"; const RegisterDeviceSuccessStep = ({ setForm, formData, navigation }) => { + const accountSecurityStep = () => { + navigation.go('AccountSecurityStep'); + } return ( <> -
- YubicoLabs

Device Added

@@ -27,10 +28,9 @@ const RegisterDeviceSuccessStep = ({ setForm, formData, navigation }) => {
- +
- ); }; diff --git a/clients/web/react/src/_components/RegisterKeySuccessStep.js b/clients/web/react/src/_components/RegisterKeySuccessStep.js index 79b8610..3a69809 100644 --- a/clients/web/react/src/_components/RegisterKeySuccessStep.js +++ b/clients/web/react/src/_components/RegisterKeySuccessStep.js @@ -11,8 +11,6 @@ const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { return ( <> -
- YubicoLabs

Security Key Added

@@ -35,7 +33,6 @@ const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => {
- ); }; diff --git a/clients/web/react/src/_components/RegisterSvPinStep.js b/clients/web/react/src/_components/RegisterSvPinStep.js index f4c1b15..74376ef 100644 --- a/clients/web/react/src/_components/RegisterSvPinStep.js +++ b/clients/web/react/src/_components/RegisterSvPinStep.js @@ -4,14 +4,12 @@ import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; import styles from "./component.module.css"; const RegisterSvPinStep = ({ setForm, formData, navigation }) => { - const LogInStep = () => { - navigation.go('LogInStep'); + const accountSecurityStep = () => { + navigation.go('AccountSecurityStep'); } return ( <> -
- YubicoLabs

Create your Server-Verified PIN

@@ -40,10 +38,9 @@ const RegisterSvPinStep = ({ setForm, formData, navigation }) => {
- +
- ); }; diff --git a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js index 317528a..5558f49 100644 --- a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js +++ b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js @@ -7,12 +7,17 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { const setTrustedDevice = (value) => { localStorage.setItem('trustedDevice', value); + accountSecurityStep(); } const registerDeviceSuccessStep = () => { navigation.go('RegisterDeviceSuccessStep'); } + const accountSecurityStep = () => { + navigation.go('AccountSecurityStep'); + } + const next = () => { setTrustedDevice(true); registerDeviceSuccessStep(); @@ -20,18 +25,16 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { return ( <> -
- YubicoLabs

Log In Faster on This Device

- +
- +

@@ -39,12 +42,11 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => {
Don't want to register this device?
    -
  • Ask me later
  • +
  • Ask me later
  • setTrustedDevice(false)} className="btn-link">Never ask me to register this device
-
); }; diff --git a/clients/web/react/src/_components/SignUpStep.js b/clients/web/react/src/_components/SignUpStep.js index 377d67f..13803f5 100644 --- a/clients/web/react/src/_components/SignUpStep.js +++ b/clients/web/react/src/_components/SignUpStep.js @@ -76,8 +76,6 @@ const SignUpStep = ({ setForm, formData, navigation }) => { return ( <> -
- YubicoLabs

Welcome

@@ -121,7 +119,6 @@ const SignUpStep = ({ setForm, formData, navigation }) => {
Already have an account? Log In
-
); }; From b10f6df895d43e10664dd035ec5f1c26d060800d Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Thu, 27 May 2021 16:23:51 -0700 Subject: [PATCH 08/66] added validation --- .../IdentifierFirstFlowProto.jsx | 55 ------- .../web/react/src/_components/ForgotStep.js | 90 +++++++---- .../web/react/src/_components/LoginStep.js | 28 +++- .../react/src/_components/PromptSvPinStep.js | 129 +++++++++++---- .../src/_components/RegisterSvPinStep.js | 151 ++++++++++++++---- .../_components/RegisterTrustedDeviceStep.js | 7 +- .../web/react/src/_components/SignUpStep.js | 2 +- 7 files changed, 304 insertions(+), 158 deletions(-) diff --git a/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx b/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx index b374770..13a15f1 100755 --- a/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx +++ b/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx @@ -9,61 +9,6 @@ import validate from 'validate.js'; import { IdentifierFirstFlow } from '../_components'; function IdentifierFirstFlowProto() { - const [inputs, setInputs] = useState({ - username: '' - }); - const [submitted, setSubmitted] = useState(false); - const [invalidUsername, setInvalidUsername] = useState(undefined); - const { username } = inputs; - const loggingIn = useSelector(state => state.authentication.loggingIn); - const dispatch = useDispatch(); - var constraints = { - username: { - presence: true, - format: { - pattern: "[a-z0-9_\-]+", - flags: "i", - message: "can only contain a-z, 0-9, or _-" - }, - length: { - minimum: 3, - maximum: 20 - } - } - }; - - // reset login status - useEffect(() => { - dispatch(userActions.logout()); - }, []); - - function handleChange(e) { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - } - - function handleSubmit(e) { - e.preventDefault(); - - setSubmitted(true); - - const result = validate({username: username}, constraints) - if(result){ - console.error("invalid username: ", result); - setInvalidUsername(result.username.join(". ")); - return; - } else { - setInvalidUsername(undefined); - } - - dispatch(userActions.exists(username.toLocaleLowerCase())); - - } - - function handleLoginWithoutUsername() { - localStorage.removeItem('username'); - history.push('/loginWithSecurityKey'); - } return ( <> diff --git a/clients/web/react/src/_components/ForgotStep.js b/clients/web/react/src/_components/ForgotStep.js index 797a9c1..caf182b 100644 --- a/clients/web/react/src/_components/ForgotStep.js +++ b/clients/web/react/src/_components/ForgotStep.js @@ -1,9 +1,16 @@ -import React from "react"; -import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; import styles from "./component.module.css"; const ForgotStep = ({ setForm, formData, navigation }) => { + const [validated, setValidated] = useState(false); + + const [inputs, setInputs] = useState({ + username: localStorage.getItem('username'), + recoveryCode: undefined + }); + const LogInStep = () => { navigation.go('LogInStep'); } @@ -11,35 +18,60 @@ const ForgotStep = ({ setForm, formData, navigation }) => { navigation.go('AccountSecurityStep'); } + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + setValidated(false); + } + + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + setValidated(true); + + if (inputs.recoveryCode) { + accountSecurityStep(); + } + } + return ( <> -
-

Forgot Your Security Key?

- -
-
-
- - - Recovery Code - - - -
-
- -
-
-
-
-
-
Back to Log In
-
-
+
+

Forgot Your Security Key?

+ +
+
+ + + Recovery Code + + + + Please provide a recover code. + + + +
+
+
+
+
+
Back to Log In
+
); }; diff --git a/clients/web/react/src/_components/LoginStep.js b/clients/web/react/src/_components/LoginStep.js index be97699..c15c945 100644 --- a/clients/web/react/src/_components/LoginStep.js +++ b/clients/web/react/src/_components/LoginStep.js @@ -6,7 +6,9 @@ import styles from "./component.module.css"; const LogInStep = ({ navigation }) => { const [inputs, setInputs] = useState({ - username: localStorage.getItem('username') + username: localStorage.getItem('username'), + forgotStep: false, + continue: false }); const [errors, setErrors] = useState({ username: '' @@ -41,6 +43,16 @@ const LogInStep = ({ navigation }) => { navigation.go('AccountSecurityStep'); } + const forgotClickHandler = () => { + setInputs(inputs => ({ ...inputs, ["continue"]: false })); + setInputs(inputs => ({ ...inputs, ["forgotStep"]: true })); + } + + const continueClickHandler = () => { + setInputs(inputs => ({ ...inputs, ["continue"]: true })); + setInputs(inputs => ({ ...inputs, ["forgotStep"]: false })); + } + const handleChange = (e) => { const { name, value } = e.target; setInputs(inputs => ({ ...inputs, [name]: value })); @@ -50,7 +62,6 @@ const LogInStep = ({ navigation }) => { const result = validate({ username: value }, constraints); if (result) { setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); - return; } else { setErrors(errors => ({ ...errors, [name]: undefined })); } @@ -67,7 +78,13 @@ const LogInStep = ({ navigation }) => { if(isUsernameValid()) { setValidated(true); - promptSvPinStep(); + localStorage.setItem('username', inputs.username); + if(inputs.continue === true) { + promptSvPinStep(); + } else if (inputs.forgotStep === true) { + forgotStep(); + } + } else { setValidated(false); } @@ -109,8 +126,9 @@ const LogInStep = ({ navigation }) => { -
Forgot Your Security Key?
- + + +

OR diff --git a/clients/web/react/src/_components/PromptSvPinStep.js b/clients/web/react/src/_components/PromptSvPinStep.js index ea44a8c..035e740 100644 --- a/clients/web/react/src/_components/PromptSvPinStep.js +++ b/clients/web/react/src/_components/PromptSvPinStep.js @@ -1,9 +1,35 @@ -import React from "react"; -import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; +import validate from 'validate.js'; import styles from "./component.module.css"; const PromptSvPinStep = ({ setForm, formData, navigation }) => { + const [validated, setValidated] = useState(false); + + var constraints = { + pin: { + presence: true, + numericality: { + onlyInteger: true, + greaterThan: -1, + }, + length: { + minimum: 4, + maximum: 16 + } + } + }; + + const [inputs, setInputs] = useState({ + username: localStorage.getItem('username'), + pin: '' + }); + + const [errors, setErrors] = useState({ + pin: '' + }); + const LogInStep = () => { navigation.go('LogInStep'); } @@ -11,35 +37,80 @@ const PromptSvPinStep = ({ setForm, formData, navigation }) => { navigation.go('RegisterTrustedDeviceStep'); } + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + setValidated(false); + + const result = validate(inputs, constraints); + if (result) { + if (result[name]) { + setErrors(errors => ({ ...errors, [name]: result[name].join(". ") })); + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } + + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + setValidated(true); + + if (isInputValid()) { + registerTrustedDeviceStep(); + } + } + + const isInputValid = () => { + if (validate(inputs, constraints)) { + return false; + } + return true; + } + return ( <> -
-

Welcome

- -
-
-
- - - Server Verified PIN - - - -
-
- -
-
-
-
-
-
Try Another Method
-
-
+
+

Welcome

+ +
+
+ + + Server Verified PIN + + + + {errors.pin} + + + +
+
+
+
+
+
Try Another Method
+
); }; diff --git a/clients/web/react/src/_components/RegisterSvPinStep.js b/clients/web/react/src/_components/RegisterSvPinStep.js index 74376ef..10bd92a 100644 --- a/clients/web/react/src/_components/RegisterSvPinStep.js +++ b/clients/web/react/src/_components/RegisterSvPinStep.js @@ -1,46 +1,131 @@ -import React from "react"; -import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; +import validate from 'validate.js'; import styles from "./component.module.css"; const RegisterSvPinStep = ({ setForm, formData, navigation }) => { + const [validated, setValidated] = useState(false); + + var constraints = { + pin: { + presence: true, + numericality: { + onlyInteger: true, + greaterThan: -1, + }, + length: { + minimum: 4, + maximum: 16 + } + }, + confirmPin: { + equality: "pin" + } + }; + + const [inputs, setInputs] = useState({ + username: localStorage.getItem('username'), + pin: '', + confirmPin: '' + }); + + const [errors, setErrors] = useState({ + pin: '', + confirmPin: '' + }); + const accountSecurityStep = () => { navigation.go('AccountSecurityStep'); } + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + setValidated(false); + + const result = validate(inputs, constraints); + if (result) { + if (result[name]) { + setErrors(errors => ({ ...errors, [name]: result[name].join(". ") })); + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } + + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + setValidated(true); + + if (isInputValid()) { + accountSecurityStep(); + } + } + + const isInputValid = () => { + if (validate(inputs, constraints)) { + return false; + } + return true; + } + + return ( <> -
-

Create your Server-Verified PIN

- -
-
-
- - - Server Verified PIN - - - - - - Confirm PIN             - - - -
-
- -
-
+
+

Create your Server-Verified PIN

+ +
+
+ + + Server Verified PIN + + + + {errors.pin} + + + + + Confirm PIN             + + + + {errors.confirmPin} + + + +
); }; diff --git a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js index 5558f49..1868adb 100644 --- a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js +++ b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js @@ -7,7 +7,7 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { const setTrustedDevice = (value) => { localStorage.setItem('trustedDevice', value); - accountSecurityStep(); + registerDeviceSuccessStep(); } const registerDeviceSuccessStep = () => { @@ -18,11 +18,6 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { navigation.go('AccountSecurityStep'); } - const next = () => { - setTrustedDevice(true); - registerDeviceSuccessStep(); - } - return ( <>
diff --git a/clients/web/react/src/_components/SignUpStep.js b/clients/web/react/src/_components/SignUpStep.js index 13803f5..4e2fab3 100644 --- a/clients/web/react/src/_components/SignUpStep.js +++ b/clients/web/react/src/_components/SignUpStep.js @@ -7,7 +7,7 @@ import styles from "./component.module.css"; const SignUpStep = ({ setForm, formData, navigation }) => { const [inputs, setInputs] = useState({ - username: '' + username: localStorage.getItem('username') }); const [errors, setErrors] = useState({ username: '' From ccbc2e95f00ad0132f5fc7ac6a42ef27f4aa290c Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Tue, 1 Jun 2021 10:24:33 -0700 Subject: [PATCH 09/66] hide pins/codes --- clients/web/react/src/App/App.jsx | 1 - clients/web/react/src/_components/ForgotStep.js | 1 + clients/web/react/src/_components/PromptSvPinStep.js | 1 + clients/web/react/src/_components/RegisterSvPinStep.js | 2 ++ 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/clients/web/react/src/App/App.jsx b/clients/web/react/src/App/App.jsx index 0d798e4..f774b07 100644 --- a/clients/web/react/src/App/App.jsx +++ b/clients/web/react/src/App/App.jsx @@ -47,7 +47,6 @@ function App() { -
diff --git a/clients/web/react/src/_components/ForgotStep.js b/clients/web/react/src/_components/ForgotStep.js index caf182b..8b41232 100644 --- a/clients/web/react/src/_components/ForgotStep.js +++ b/clients/web/react/src/_components/ForgotStep.js @@ -57,6 +57,7 @@ const ForgotStep = ({ setForm, formData, navigation }) => { placeholder="Enter Recovery Code" aria-label="Recovery Code" aria-describedby="basic-addon1" + type="password" onChange={handleChange} required /> diff --git a/clients/web/react/src/_components/PromptSvPinStep.js b/clients/web/react/src/_components/PromptSvPinStep.js index 035e740..dc84a23 100644 --- a/clients/web/react/src/_components/PromptSvPinStep.js +++ b/clients/web/react/src/_components/PromptSvPinStep.js @@ -94,6 +94,7 @@ const PromptSvPinStep = ({ setForm, formData, navigation }) => { placeholder="PIN" aria-label="PIN" aria-describedby="basic-addon1" + type="password" onChange={handleChange} isInvalid={!isInputValid()} isValid={isInputValid()} diff --git a/clients/web/react/src/_components/RegisterSvPinStep.js b/clients/web/react/src/_components/RegisterSvPinStep.js index 10bd92a..9975922 100644 --- a/clients/web/react/src/_components/RegisterSvPinStep.js +++ b/clients/web/react/src/_components/RegisterSvPinStep.js @@ -97,6 +97,7 @@ const RegisterSvPinStep = ({ setForm, formData, navigation }) => { placeholder="PIN" aria-label="PIN" aria-describedby="basic-addon1" + type="password" onChange={handleChange} isInvalid={!isInputValid()} isValid={isInputValid()} @@ -115,6 +116,7 @@ const RegisterSvPinStep = ({ setForm, formData, navigation }) => { placeholder="PIN" aria-label="PIN" aria-describedby="basic-addon1" + type="password" onChange={handleChange} isInvalid={!isInputValid()} isValid={isInputValid()} From b15041cd5a34982d99ce51c810bc2f84e8a2732d Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Fri, 11 Jun 2021 11:58:38 -0700 Subject: [PATCH 10/66] uprade UI to Card --- clients/web/react/src/App/App.jsx | 21 ++++++++++++------- .../src/_components/IdentifierFirstFlow.jsx | 10 ++------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/clients/web/react/src/App/App.jsx b/clients/web/react/src/App/App.jsx index f774b07..ac57b20 100644 --- a/clients/web/react/src/App/App.jsx +++ b/clients/web/react/src/App/App.jsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { Router, Route, Switch, Redirect } from 'react-router-dom'; import { useDispatch, useSelector } from 'react-redux'; -import { Jumbotron, Container, Row, Col } from 'react-bootstrap'; +import { Jumbotron, Container, Row, Col, Card } from 'react-bootstrap'; import { history } from '../_helpers'; import { alertActions } from '../_actions'; @@ -31,12 +31,16 @@ function App() { }, []); return ( -
-
-
+ + + + {alert.message &&
{alert.message}
} + + + YubicoLabs @@ -47,9 +51,12 @@ function App() { -
-
-
+ + + + + + ); } diff --git a/clients/web/react/src/_components/IdentifierFirstFlow.jsx b/clients/web/react/src/_components/IdentifierFirstFlow.jsx index cfd2995..2fdb6db 100644 --- a/clients/web/react/src/_components/IdentifierFirstFlow.jsx +++ b/clients/web/react/src/_components/IdentifierFirstFlow.jsx @@ -63,14 +63,8 @@ export const IdentifierFirstFlow = ({ images }) => { }; return ( - <> - - - YubicoLabs - {renderSwitch(id)} - - - + <> + {renderSwitch(id)} ); From 92f10b412286588fd2c104c8b9b98702520c0aae Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Tue, 31 Aug 2021 11:59:53 -0700 Subject: [PATCH 11/66] fix error log level --- .../JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java b/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java index 32c5fa0..a6cd15e 100644 --- a/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java +++ b/backend/lambda-functions/JavaWebAuthnLib/src/main/java/com/yubicolabs/App.java @@ -301,7 +301,7 @@ Object finishRegistration(JsonObject responseJson) { request ); } catch (RegistrationFailedException e) { - log.debug("Registration failed!", e); + log.error("Registration failed!", e); return e; } catch (Exception e) { log.error("Registration failed unexpectedly; this is likely a bug.", e); From fedac319baffa1574adeac8b539cf3552dfa1b82 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Tue, 31 Aug 2021 12:17:21 -0700 Subject: [PATCH 12/66] login flow refresh (happy path) --- clients/web/react/src/App/App.jsx | 3 +- clients/web/react/src/LoginPage/ForgotStep.js | 123 ++++++ .../LoginPage/IdentifierFirstLoginFlow.jsx | 54 +++ .../IdentifierFirstLoginFlowPage.jsx | 14 + clients/web/react/src/LoginPage/LogInStep.js | 368 ++++++++++++++++++ .../src/LoginPage/LogInTrustedDeviceStep.js | 132 +++++++ .../react/src/LoginPage/PromptSvPinStep.js | 119 ++++++ .../LoginPage/RegisterDeviceSuccessStep.js | 39 ++ .../LoginPage/RegisterTrustedDeviceStep.js | 113 ++++++ clients/web/react/src/LoginPage/index.js | 4 +- .../src/_components/UserVerificationClient.js | 53 +++ .../react/src/_components/WebAuthnClient.js | 314 +++++++++++++++ clients/web/react/src/_components/index.js | 3 +- 13 files changed, 1336 insertions(+), 3 deletions(-) create mode 100644 clients/web/react/src/LoginPage/ForgotStep.js create mode 100644 clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.jsx create mode 100755 clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.jsx create mode 100644 clients/web/react/src/LoginPage/LogInStep.js create mode 100644 clients/web/react/src/LoginPage/LogInTrustedDeviceStep.js create mode 100644 clients/web/react/src/LoginPage/PromptSvPinStep.js create mode 100644 clients/web/react/src/LoginPage/RegisterDeviceSuccessStep.js create mode 100644 clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js create mode 100644 clients/web/react/src/_components/UserVerificationClient.js create mode 100644 clients/web/react/src/_components/WebAuthnClient.js diff --git a/clients/web/react/src/App/App.jsx b/clients/web/react/src/App/App.jsx index ac57b20..efc29a8 100644 --- a/clients/web/react/src/App/App.jsx +++ b/clients/web/react/src/App/App.jsx @@ -8,6 +8,7 @@ import { alertActions } from '../_actions'; import { PrivateRoute } from '../_components'; import { HomePage } from '../HomePage'; import { LoginPage } from '../LoginPage'; +import { IdentifierFirstLoginFlowPage } from '../LoginPage'; import { LoginWithSecurityKeyPage } from '../LoginWithSecurityKeyPage'; import { RegisterPage } from '../RegisterPage'; import { IdentifierFirstFlowProto } from '../IdentifierFirstFlowProto'; @@ -44,7 +45,7 @@ function App() { - + diff --git a/clients/web/react/src/LoginPage/ForgotStep.js b/clients/web/react/src/LoginPage/ForgotStep.js new file mode 100644 index 0000000..a3d805e --- /dev/null +++ b/clients/web/react/src/LoginPage/ForgotStep.js @@ -0,0 +1,123 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; + +import { Auth } from 'aws-amplify'; + +import { alertActions } from '../_actions'; +import { history } from '../_helpers'; + + +const ForgotStep = ({ setForm, formData, navigation }) => { + const [validated, setValidated] = useState(false); + const dispatch = useDispatch(); + + const [inputs, setInputs] = useState({ + username: localStorage.getItem('username'), + recoveryCode: undefined + }); + + const LogInStep = () => { + // TODO: Clear Alerts + navigation.go('LogInStep'); + } + + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + setValidated(false); + } + + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + setValidated(true); + + if (inputs.recoveryCode) { + handleRecoveryCode(inputs.recoveryCode); + } + } + + async function handleRecoveryCode(code) { + try { + let cognitoUser = await Auth.signIn(inputs.username); + console.log("CognitoUser: ", cognitoUser); + + Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify({ recoveryCode: code })) + .then(user => { + console.log(user); + + Auth.currentSession() + .then(data => { + dispatch(alertActions.success('Authentication successful')); + let userData = { + id: 1, + username: user.attributes.name, + token: data.getAccessToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + console.log("userData ", localStorage.getItem('user')); + history.push('/'); + }) + .catch(err => { + console.log("currentSession error: ", err); + dispatch(alertActions.error("Something went wrong. ", err.message)); + }); + }) + .catch(err => { + console.log("sendCustomChallengeAnswer error: ", err); + let msg = "Invalid recovery code"; + dispatch(alertActions.error(msg)); + }); + + } catch (error) { + console.error("recovery code error"); + console.error(error); + dispatch(alertActions.error(error.message)); + } + } + + return ( + <> +
+

Forgot Your Security Key?

+ +
+
+ + + Recovery Code + + + + Please provide a recover code. + + + +
+
+
+
+
+
Back to Log In
+
+ + ); +}; + +export default ForgotStep; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.jsx b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.jsx new file mode 100644 index 0000000..8813fc1 --- /dev/null +++ b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.jsx @@ -0,0 +1,54 @@ +import React from "react"; +import { useStep } from "react-hooks-helper"; + +import LogInStep from "./LogInStep"; +import ForgotStep from "./ForgotStep"; +import PromptSvPinStep from "./PromptSvPinStep"; +import RegisterTrustedDeviceStep from "./RegisterTrustedDeviceStep"; +import LogInTrustedDeviceStep from "./LogInTrustedDeviceStep"; +import RegisterDeviceSuccessStep from "./RegisterDeviceSuccessStep"; + +const steps = [ + { id: "LogInTrustedDeviceStep" }, + { id: "LogInStep" }, + { id: "ForgotStep" }, + { id: "PromptSvPinStep" }, + { id: "RegisterTrustedDeviceStep" }, + { id: "RegisterDeviceSuccessStep" } +]; + +export const IdentifierFirstLoginFlow = ({ images }) => { + let trustedDevice = localStorage.getItem('trustedDevice'); + const _initialStep = trustedDevice === "true" ? 0 : 1; + const { step, navigation } = useStep({ initialStep: _initialStep, steps }); + + const { id } = step; + + const props = { navigation }; + + const renderSwitch = (id) => { + switch (id) { + case "LogInTrustedDeviceStep": + return ; + case "LogInStep": + return ; + case "ForgotStep": + return ; + case "PromptSvPinStep": + return ; + case "RegisterTrustedDeviceStep": + return ; + case "RegisterDeviceSuccessStep": + return ; + default: + return null; + } + }; + + return ( + <> + {renderSwitch(id)} + + ); + +} \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.jsx b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.jsx new file mode 100755 index 0000000..6283520 --- /dev/null +++ b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.jsx @@ -0,0 +1,14 @@ +import React from 'react'; + +import { IdentifierFirstLoginFlow } from '.'; + +function IdentifierFirstLoginFlowPage() { + + return ( + <> + + + ); +} + +export { IdentifierFirstLoginFlowPage }; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/LogInStep.js b/clients/web/react/src/LoginPage/LogInStep.js new file mode 100644 index 0000000..286ca52 --- /dev/null +++ b/clients/web/react/src/LoginPage/LogInStep.js @@ -0,0 +1,368 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, Form, Spinner } from 'react-bootstrap'; +import { useDispatch, useSelector } from 'react-redux'; + +import { userActions, credentialActions, alertActions } from '../_actions'; +import { history } from '../_helpers'; +import { ServerVerifiedPin } from '../_components'; + +import { get, supported } from '@github/webauthn-json'; +import base64url from 'base64url'; +import { Auth } from 'aws-amplify'; +import validate from 'validate.js'; + +import styles from "../_components/component.module.css"; + +const LogInStep = ({ navigation }) => { + const [inputs, setInputs] = useState({ + username: localStorage.getItem('username'), + forgotStep: false, + continue: false + }); + const [errors, setErrors] = useState({ + username: '' + }); + const [validated, setValidated] = useState(false); + const [cognitoUser, setCognitoUser] = useState({}); + const webAuthnStartResponse = useSelector(state => state.authentication.webAuthnStartResponse); + const defaultInvalidPIN = -1; + const [continueSubmitted, setContinueSubmitted] = useState(false); + + const constraints = { + username: { + presence: true, + format: { + pattern: "[a-z0-9_\-]+", + flags: "i", + message: "can only contain a-z, 0-9, or _-" + }, + length: { + minimum: 3, + maximum: 20 + } + } + }; + + const dispatch = useDispatch(); + + // reset login status + /*useEffect(() => { + dispatch(userActions.logout()); + + if(inputs.username) { + signInWithUsername(); + } else { + setContinueSubmitted(true); + dispatch(userActions.webAuthnStart()); + } + + }, []);*/ + + useEffect(() => { + if (webAuthnStartResponse) { + signInWithoutUsername(); + } + }, [webAuthnStartResponse]); + + function getUV(authenticatorData) { + let buffer = base64url.toBuffer(authenticatorData); + + let flagsBuf = buffer.slice(32, 33); + let flagsInt = flagsBuf[0]; + let flags = { + up: !!(flagsInt & 0x01), + uv: !!(flagsInt & 0x04), + at: !!(flagsInt & 0x40), + ed: !!(flagsInt & 0x80), + flagsInt + }; + return flags.uv; + } + + async function signIn(name) { + console.log("signIn ", name); + setContinueSubmitted(true); + + const lowercaseName = name.toLocaleLowerCase(); + + localStorage.setItem('username', lowercaseName); + + try { + let cognitoUser = await Auth.signIn(lowercaseName); + setCognitoUser(cognitoUser); + console.log("SignIn CognitoUser: ", cognitoUser); + + if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.create') { + dispatch(alertActions.error("Please Sign Up")); + history.push('/login'); + return; + } else if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.get') { + + console.log("assertion request: " + JSON.stringify(cognitoUser.challengeParam, null, 2)); + + const request = JSON.parse(cognitoUser.challengeParam.publicKeyCredentialRequestOptions); + console.log("request: ", request); + + const publicKey = { "publicKey": request.publicKeyCredentialRequestOptions }; + console.log("publicKey: ", publicKey); + + let assertionResponse = await get(publicKey); + console.log("assertion response: " + JSON.stringify(assertionResponse)); + + let uv = getUV(assertionResponse.response.authenticatorData); + console.log("uv: " + uv); + + let challengeResponse = { + credential: assertionResponse, + requestId: request.requestId, + pinCode: defaultInvalidPIN + }; + console.log("challengeResponse: ", challengeResponse); + + if (uv == false) { + dispatch(credentialActions.getUV(challengeResponse)); + } else { + console.log("sending Custom Challenge Answer"); + // to send the answer of the custom challenge + Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) + .then(user => { + console.log(user); + + Auth.currentSession() + .then(data => { + dispatch(alertActions.success('Authentication successful')); + let userData = { + id: 1, + username: user.attributes.name, + token: data.getAccessToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + console.log("userData ", localStorage.getItem('user')); + + registerTrustedDeviceOrContinue('/'); + }) + .catch(err => { + console.error("currentSession error: ", err); + dispatch(alertActions.error("Something went wrong. ", err.message)); + setContinueSubmitted(false); + }); + + }) + .catch(err => { + console.error("sendCustomChallengeAnswer error: ", err); + dispatch(alertActions.error(err.message)); + }); + } + } else { + setContinueSubmitted(false); + dispatch(alertActions.error("Invalid server response")); + } + } catch (err) { + console.error("signIn error"); + console.error(err); + setContinueSubmitted(false); + dispatch(alertActions.error(err.message)); + } + } + + function registerTrustedDeviceOrContinue(path) { + let trustedDevice = localStorage.getItem('trustedDevice'); + console.log("trustedDevice=",trustedDevice); + + if (trustedDevice === null) { + PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() + .then(function (available) { + if (available) { + registerTrustedDeviceStep(); + } else { + history.push(path); + } + }).catch(function (err) { + console.error(err); + history.push(path); + }); + + } else { + history.push(path); + } + } + + function UV(props) { + const cognitoUser = props.cognitoUser; + const finishUVRequest = useSelector(state => state.credentials.finishUVRequest); + const svpinDispatchProps = { type: "dispatch", saveCallback: finishUVResponse, showSelector: finishUVRequest }; + + + function finishUVResponse(fields) { + let challengeResponse = finishUVRequest; + console.log("sending authenticator response with sv-pin: ", challengeResponse); + challengeResponse.pinCode = parseInt(fields.pin); + + Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) + .then(user => { + console.log("uv sendCustomChallengeAnswer: ", user); + + Auth.currentSession() + .then(data => { + dispatch(alertActions.success('Authentication successful')); + let userData = { + id: 1, + username: user.attributes.name, + token: data.getAccessToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + console.log("userData ", localStorage.getItem('user')); + history.push('/'); + }) + .catch(err => { + console.log("currentSession error: ", err); + dispatch(alertActions.error("Something went wrong. ", err.message)); + setContinueSubmitted(false); + }); + + }) + .catch(err => { + console.log("sendCustomChallengeAnswer error: ", err); + let message = "Invalid PIN"; + dispatch(alertActions.error(message)); + setContinueSubmitted(false); + }); + dispatch(credentialActions.completeUV()); + } + + return ( + <> + + + ); + } + + const promptSvPinStep = () => { + navigation.go('PromptSvPinStep'); + } + const registerTrustedDeviceStep = () => { + navigation.go('RegisterTrustedDeviceStep'); + } + const signUpStep = () => { + history.push('/register'); + } + const forgotStep = () => { + navigation.go('ForgotStep'); + } + const accountSecurityStep = () => { + signIn(); + } + + const forgotClickHandler = () => { + setInputs(inputs => ({ ...inputs, ["continue"]: false })); + setInputs(inputs => ({ ...inputs, ["forgotStep"]: true })); + } + + const continueClickHandler = () => { + setInputs(inputs => ({ ...inputs, ["continue"]: true })); + setInputs(inputs => ({ ...inputs, ["forgotStep"]: false })); + } + + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + setValidated(false); + + const result = validate({ username: value }, constraints); + if (result) { + setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } + + const handleSubmit = async (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + if (isUsernameValid()) { + setValidated(true); + if (inputs.continue === true) { + signIn(inputs.username); + } else if (inputs.forgotStep === true) { + forgotStep(); + } + + } else { + setValidated(false); + } + } + + const isUsernameValid = () => { + if (validate({ username: inputs.username }, constraints)) { + return false; + } + return true; + } + + + return ( + <> +
+

Welcome

+ +
+
+ + + + @ + + + + {errors.username} + + + + + +

+
+
+ OR +
+
+ +
+
+
+
+
+
Don't have an account? Sign Up
+
+ + + ); +}; + +export default LogInStep; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.js b/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.js new file mode 100644 index 0000000..d2cae35 --- /dev/null +++ b/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.js @@ -0,0 +1,132 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { Button, Label } from 'react-bootstrap'; + +import { Auth } from 'aws-amplify'; +import { get, supported } from '@github/webauthn-json'; + +import { userActions, alertActions } from '../_actions'; +import { history } from '../_helpers'; + + +const LogInTrustedDeviceStep = ({ setForm, formData, navigation }) => { + + const webAuthnStartResponse = useSelector(state => state.authentication.webAuthnStartResponse); + const defaultInvalidPIN = -1; + const dispatch = useDispatch(); + + useEffect(() => { + if(webAuthnStartResponse) { + signInWithoutUsername(); + } + }, [webAuthnStartResponse]); + + const LogInStep = () => { + navigation.go('LogInStep'); + } + + const continueStep = () => { + dispatch(userActions.webAuthnStart()); + } + + async function signInWithoutUsername() { + console.log("signInWithoutUsername"); + + // get usernameless auth request + console.log("webAuthnStartResponse: ", webAuthnStartResponse); + + const publicKey = {"publicKey": webAuthnStartResponse.publicKeyCredentialRequestOptions}; + console.log("publicKey: ", publicKey); + + let assertionResponse = await get(publicKey); + console.log("assertionResponse: ", assertionResponse); + + // get username from assertionResponse + const username = assertionResponse.response.userHandle; + console.log("userhandle: ", username); + + let challengeResponse = { + credential: assertionResponse, + requestId: webAuthnStartResponse.requestId, + pinCode: defaultInvalidPIN + }; + + + Auth.signIn(username) + .then(user => { + if(user.challengeName === 'CUSTOM_CHALLENGE' && user.challengeParam.type === 'webauthn.create'){ + dispatch(alertActions.error("Please register an account")); + history.push('/register'); + return; + } else if (user.challengeName === 'CUSTOM_CHALLENGE' && user.challengeParam.type === 'webauthn.get') { + // to send the answer of the custom challenge + console.log("uv sending Custom Challenge Answer"); + Auth.sendCustomChallengeAnswer(user, JSON.stringify(challengeResponse)) + .then(user => { + console.log(user); + + Auth.currentSession() + .then(data => { + dispatch(alertActions.success('Authentication successful')); + // TODO: Investigate why user.attributes is not present + //let userData = { + // id: 1, + // username: user.attributes.name, + // token: data.getAccessToken().getJwtToken() + //} + let userData = { + id: 1, + token: data.getAccessToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + console.log("userData ", localStorage.getItem('user')); + history.push('/'); + }) + .catch(err => { + console.log("currentSession error: ", err); + dispatch(alertActions.error("Something went wrong. ", err.message)); + }); + + }) + .catch(err => { + console.error("sendCustomChallengeAnswer error: ", err); + dispatch(alertActions.error(err.message)); + }); + } else { + setSubmitted(false); + dispatch(alertActions.error("Invalid server response")); + } + }) + .catch(error => { + console.error("signIn error"); + console.error(error); + dispatch(alertActions.error(error.message)); + }); + } + + + return ( + <> +
+

Welcome

+ +
+
+
+
+
+
+ +
+
+
+
+
+
Try Another Method
+
+
+ + ); +}; + +export default LogInTrustedDeviceStep; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/PromptSvPinStep.js b/clients/web/react/src/LoginPage/PromptSvPinStep.js new file mode 100644 index 0000000..a1132b7 --- /dev/null +++ b/clients/web/react/src/LoginPage/PromptSvPinStep.js @@ -0,0 +1,119 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; +import validate from 'validate.js'; + +import styles from "../_components/component.module.css"; + +const PromptSvPinStep = ({ setForm, formData, navigation }) => { + const [validated, setValidated] = useState(false); + + var constraints = { + pin: { + presence: true, + numericality: { + onlyInteger: true, + greaterThan: -1, + }, + length: { + minimum: 4, + maximum: 16 + } + } + }; + + const [inputs, setInputs] = useState({ + username: localStorage.getItem('username'), + pin: '' + }); + + const [errors, setErrors] = useState({ + pin: '' + }); + + const LogInStep = () => { + navigation.go('LogInStep'); + } + const registerTrustedDeviceStep = () => { + navigation.go('RegisterTrustedDeviceStep'); + } + + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + setValidated(false); + + const result = validate(inputs, constraints); + if (result) { + if (result[name]) { + setErrors(errors => ({ ...errors, [name]: result[name].join(". ") })); + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } + + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + setValidated(true); + + if (isInputValid()) { + registerTrustedDeviceStep(); + } + } + + const isInputValid = () => { + if (validate(inputs, constraints)) { + return false; + } + return true; + } + + return ( + <> +
+

Welcome

+ +
+
+ + + Server Verified PIN + + + + {errors.pin} + + + +
+
+
+
+
+
Try Another Method
+
+ + ); +}; + +export default PromptSvPinStep; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/RegisterDeviceSuccessStep.js b/clients/web/react/src/LoginPage/RegisterDeviceSuccessStep.js new file mode 100644 index 0000000..f69e35d --- /dev/null +++ b/clients/web/react/src/LoginPage/RegisterDeviceSuccessStep.js @@ -0,0 +1,39 @@ +import React from "react"; +import { Button, InputGroup, FormControl, } from 'react-bootstrap'; + +import { history } from '../_helpers'; + + +const RegisterDeviceSuccessStep = ({ setForm, formData, navigation }) => { + const accountSecurityStep = () => { + history.push('/'); + } + + return ( + <> +
+

Device Added

+ +
+
+
+ + + + + + +
+
+ +
+
+ + ); +}; + +export default RegisterDeviceSuccessStep; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js b/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js new file mode 100644 index 0000000..023556d --- /dev/null +++ b/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js @@ -0,0 +1,113 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; +import { useDispatch, useSelector } from 'react-redux'; + +import { history } from '../_helpers'; +import { WebAuthnClient } from '../_components'; +import { userActions, credentialActions, alertActions } from '../_actions'; + +const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { + + const dispatch = useDispatch(); + + async function register() { + console.log("register"); + alert("Hi from the registration stub. This feature is still under construction.") + /* + //TODO: get username from formData + let username = localStorage.getItem('username'); + try { + // TODO: add hint to request authentication with an internal authenticator + let options = ""; + let userData = await WebAuthnClient.signUp(username, options, uv); + console.log("RegisterTrustedDevice register userData: ", userData); + + if (userData === undefined) { + console.error("RegisterTrustedDeviceStep register error: userData undefined"); + dispatch(alertActions.error("Something went wrong. Please try again.")); + } else { + dispatch(alertActions.success('Registration successful')); + setTrustedDevice(true); + } + + } catch (err) { + console.error("RegisterTrustedDeviceStep register error"); + console.error(err); + dispatch(alertActions.error(err.message)); + } + */ + registerDeviceSuccessStep(); + } + + function uv() { + //This is a user verifying platform. Skipping UV check. + } + + async function authenticate() { + console.log("authenticate"); + //TODO: get username from formData + let username = localStorage.getItem('username'); + try { + // TODO: add hint to request authentication with an internal authenticator + let options = ""; + let userData = await WebAuthnClient.signIn(username, options, uv); + console.log("RegisterTrustedDevice authenticate userData: ", userData); + + if (userData === undefined) { + console.error("RegisterTrustedDeviceStep authenticate error: userData undefined"); + dispatch(alertActions.error("Something went wrong. Please try again.")); + } else { + dispatch(alertActions.success('Authentication successful')); + setTrustedDevice(true); + } + + } catch (err) { + console.error("RegisterTrustedDeviceStep authenticate error"); + console.error(err); + dispatch(alertActions.error(err.message)); + } + + continueStep(); + } + + const setTrustedDevice = (value) => { + localStorage.setItem('trustedDevice', value); + } + + const registerDeviceSuccessStep = () => { + navigation.go('RegisterDeviceSuccessStep'); + } + + const continueStep = () => { + history.push('/'); + } + + return ( + <> +
+

Log In Faster on This Device

+ +
+
+
+ +
+
+ +
+
+
+
+
+ Don't want to register this device? +
    +
  • Ask me later
  • +
  • setTrustedDevice(false)} className="btn-link">Never ask me to register this device
  • +
+
+
+ + ); +}; + +export default RegisterTrustedDeviceStep; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/index.js b/clients/web/react/src/LoginPage/index.js index 52a0ddd..448a6a3 100644 --- a/clients/web/react/src/LoginPage/index.js +++ b/clients/web/react/src/LoginPage/index.js @@ -1 +1,3 @@ -export * from './LoginPage'; \ No newline at end of file +export * from './LoginPage'; +export * from './IdentifierFirstLoginFlowPage'; +export * from './IdentifierFirstLoginFlow'; \ No newline at end of file diff --git a/clients/web/react/src/_components/UserVerificationClient.js b/clients/web/react/src/_components/UserVerificationClient.js new file mode 100644 index 0000000..f83d1a6 --- /dev/null +++ b/clients/web/react/src/_components/UserVerificationClient.js @@ -0,0 +1,53 @@ +import React, { useState, useEffect, useRef, Profiler } from 'react'; +import { Button, Modal, Form, Alert, Row, Col } from 'react-bootstrap'; +import validate from 'validate.js'; + +export function UserVerificationClient(props) { + const cognitoUser = props.cognitoUser; + const finishUVRequest = useSelector(state => state.credentials.finishUVRequest); + const svpinDispatchProps = { type: "dispatch", saveCallback: finishUVResponse, showSelector: finishUVRequest }; + + + function finishUVResponse(fields) { + let challengeResponse = finishUVRequest; + console.log("sending authenticator response with sv-pin: ", challengeResponse); + challengeResponse.pinCode = parseInt(fields.pin); + + Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) + .then(user => { + console.log("uv sendCustomChallengeAnswer: ", user); + + Auth.currentSession() + .then(data => { + dispatch(alertActions.success('Authentication successful')); + let userData = { + id: 1, + username: user.attributes.name, + token: data.getAccessToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + console.log("userData ", localStorage.getItem('user')); + history.push('/'); + }) + .catch(err => { + console.log("currentSession error: ", err); + dispatch(alertActions.error("Something went wrong. ", err.message)); + setContinueSubmitted(false); + }); + + }) + .catch(err => { + console.log("sendCustomChallengeAnswer error: ", err); + let message = "Invalid PIN"; + dispatch(alertActions.error(message)); + setContinueSubmitted(false); + }); + dispatch(credentialActions.completeUV()); + } + + return ( + <> + + + ); +} \ No newline at end of file diff --git a/clients/web/react/src/_components/WebAuthnClient.js b/clients/web/react/src/_components/WebAuthnClient.js new file mode 100644 index 0000000..b782552 --- /dev/null +++ b/clients/web/react/src/_components/WebAuthnClient.js @@ -0,0 +1,314 @@ +import { get, supported } from '@github/webauthn-json'; +import base64url from 'base64url'; +import { Auth } from 'aws-amplify'; +import axios from 'axios'; + +import aws_exports from '../aws-exports'; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +export const WebAuthnClient = { + getAuthChallegeResponse, + getPublicKeyRequestOptions, + getUsernamelessAuthChallegeResponse, + getUVFromAssertion, + sendChallengeAnswer, + signIn, + signUp +}; + +const defaultInvalidPIN = -1; +const webAuthnClientExceptionName = 'WebAuthnClientException'; +const ERROR_CODE = "ERROR_CODE"; +const INVALID_CHALLENGE_TYPE = "INVALID_CHALLENGE_TYPE"; + +function WebAuthnClientException(message, code = ERROR_CODE) { + const error = new Error(message); + error.code = code; + error.name = webAuthnClientExceptionName; + return error; +} + +async function getPublicKeyRequestOptions() { + try { + const response = await axios.get('/users/credentials/fido2/authenticate'); + console.log("WebAuthnClient getPublicKeyRequestOptions() response: ", response); + return response.data; + } catch (error) { + console.error("WebAuthnClient getPublicKeyRequestOptions() error: ", error); + throw error; + } +} + +async function getUsernamelessAuthChallegeResponse() { + try { + const requestOptions = getPublicKeyRequestOptions(); + + const publicKey = { "publicKey": requestOptions.publicKeyCredentialRequestOptions }; + console.log("WebAuthnClient getUsernamelessAuthChallegeResponse() publicKey: ", publicKey); + + let assertionResponse = await get(publicKey); + console.log("WebAuthnClient getUsernamelessAuthChallegeResponse() assertionResponse: ", assertionResponse); + + const userhandle = assertionResponse.response.userHandle; //Sign in to Amazon Cognito with userhandle as the `username` + console.log("WebAuthnClient getUsernamelessAuthChallegeResponse() userhandle: ", userhandle); + + let challengeResponse = { + credential: assertionResponse, + requestId: requestOptions.requestId, + pinCode: defaultInvalidPIN + }; + console.log("WebAuthnClient getUsernamelessAuthChallegeResponse() challengeResponse: ", challengeResponse); + + return (challengeResponse, userhandle); + + } catch (error) { + console.error("WebAuthnClient getUsernamelessAuthChallegeResponse() error: ", error); + throw error; + } +} + +async function getAuthChallegeResponse(cognitoChallenge) { + try { + console.log("WebAuthnClient getAuthChallegeResponse() cognitoChallenge response: " + JSON.stringify(cognitoChallenge, null, 2)); + + const request = JSON.parse(cognitoChallenge.publicKeyCredentialRequestOptions); + console.log("WebAuthnClient getAuthChallegeResponse() request: ", request); + + const publicKey = { "publicKey": request.publicKeyCredentialRequestOptions }; + console.log("WebAuthnClient getAuthChallegeResponse() publicKey: ", publicKey); + + let assertionResponse = await get(publicKey); + console.log("WebAuthnClient getAuthChallegeResponse() assertion response: " + JSON.stringify(assertionResponse)); + + let challengeResponse = { + credential: assertionResponse, + requestId: request.requestId, + pinCode: defaultInvalidPIN + }; + console.log("WebAuthnClient getAuthChallegeResponse() challengeResponse: ", challengeResponse); + + return challengeResponse; + + } catch (error) { + console.error("WebAuthnClient getAuthChallegeResponse() error: ", error); + throw error; + } +} + +async function getCreateCredentialChallegeResponse(cognitoChallenge) { + try { + console.log("WebAuthnClient getCreateCredentialChallegeResponse() cognitoChallenge response: " + JSON.stringify(cognitoChallenge, null, 2)); + + const request = JSON.parse(cognitoChallenge.publicKeyCredentialCreationOptions); + console.log("WebAuthnClient getCreateCredentialChallegeResponse() request: ", request); + + const publicKey = { "publicKey": request.publicKeyCredentialCreationOptions }; + console.log("WebAuthnClient getCreateCredentialChallegeResponse() publicKey: ", publicKey); + + let attestationResponse = await create(publicKey); + console.log("WebAuthnClient getCreateCredentialChallegeResponse() attestationResponse: " + JSON.stringify(attestationResponse)); + + let challengeResponse = { + credential: attestationResponse, + requestId: request.requestId, + pinCode: defaultInvalidPIN + }; + console.log("WebAuthnClient getCreateCredentialChallegeResponse() challengeResponse: ", challengeResponse); + + return challengeResponse; + + } catch (error) { + console.error("WebAuthnClient getCreateCredentialChallegeResponse() error: ", error); + throw error; + } +} + +function getUVFromAssertion(authenticatorData) { + let buffer = base64url.toBuffer(authenticatorData); + + return getUV(buffer); +} + +function getUVFromAttestation(attestationObject) { + let attestationBuffer = base64url.toBuffer(attestationObject); + let attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; + let buffer = attestationStruct.authData; + + return getUV(buffer); +} + +function getUV(buffer){ + let flagsBuf = buffer.slice(32, 33); + let flagsInt = flagsBuf[0]; + let flags = { + up: !!(flagsInt & 0x01), + uv: !!(flagsInt & 0x04), + at: !!(flagsInt & 0x40), + ed: !!(flagsInt & 0x80), + flagsInt + }; + return flags.uv; +} + +async function signIn(name, options, requestUV) { + console.log("WebAuthnClient signIn() name=", name); + + try { + + let username = undefined; + let challengeResponse = undefined; + + if (name === undefined) { + console.log("WebAuthnClient signIn() usernameless flow"); + challengeResponse, username = await getUsernamelessAuthChallegeResponse(); + } else { + console.log("WebAuthnClient signIn() username flow"); + username = name.toLocaleLowerCase(); + localStorage.setItem('username', username); + } + + let cognitoUser = await Auth.signIn(username); + console.log("WebAuthnClient signIn() CognitoUser: ", cognitoUser); + + if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.create') { + + throw new WebAuthnClientException("User not found. Please Sign Up.", INVALID_CHALLENGE_TYPE); + + } else if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.get') { + + if (challengeResponse === undefined) { + console.log("WebAuthnClient signIn() get challenge response for username flow"); + challengeResponse = await getAuthChallegeResponse(cognitoUser.challengeParam); + } + console.log("WebAuthnClient signIn() challengeResponse: ", challengeResponse); + + let isUserVerified = getUVFromAssertion(challengeResponse.credential.response.authenticatorData); + console.log("WebAuthnClient signIn() isUserVerified: ", isUserVerified); + + let pin = defaultInvalidPIN; + if (isUserVerified == false) { + console.log("WebAuthnClient signIn() requesting UV: "); + pin = requestUV(); + } + + console.log("WebAuthnClient signIn() sending challenge answer"); + let userData = await sendChallengeAnswer(cognitoUser, challengeResponse, pin); + + return userData; + + } else { + //TODO move dispatch to UI logic + //dispatch(alertActions.error("Invalid server response")); + console.error("WebAuthnClient signIn() error: throw WebAuthnClientException"); + throw new WebAuthnClientException("Invalid server response"); + } + } catch (error) { + console.error("WebAuthnClient signIn() error: ", error); + //TODO move dispatch to UI logic + //dispatch(alertActions.error(err.message)); + throw error; + } +} + +async function sendChallengeAnswer(cognitoUser, challengeResponse, pin = defaultInvalidPIN) { + challengeResponse.pinCode = parseInt(pin); + console.log("WebAuthnClient sendChallengeAnswer(): ", challengeResponse); + + Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) + .then(user => { + console.log(user); + + Auth.currentSession() + .then(data => { + //TODO move dispatch to UI logic + //dispatch(alertActions.success('Authentication successful')); + let userData = { + id: 1, + username: user.attributes.name, + token: data.getAccessToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + console.log("userData ", localStorage.getItem('user')); + + return userData; + }) + .catch(err => { + console.error("WebAuthnClient sendChallengeAnswer currentSession() error: ", err); + //TODO move dispatch to UI logic + //dispatch(alertActions.error("Something went wrong. ", err.message)); + throw err; + }); + + }) + .catch(error => { + console.error("WebAuthnClient sendCustomChallengeAnswer() error: ", error); + //TODO move dispatch to UI logic + //dispatch(alertActions.error(err.message)); + throw error; + }); +} + + +async function signUp(name, requestUV) { + console.log("WebAuthnClient signUp() name=", name); + + // Start Registration + // First, Cognito needs to make an account for the user + const randomString = (length) => [...Array(length)].map(() => (Math.floor(Math.random() * 36)).toString(36)).join(''); + const password = randomString(14); + const username = name.toLocaleLowerCase(); + localStorage.setItem('username', username); + const attributes = { "name": username }; + + try { + const { user } = await Auth.signUp({ + username, + password, + attributes + }); + console.log("SignUp: ", user); + } catch (error) { + // A user can get here if they come back to register after the initial registration was interrupted + console.log(error); + } + + // Second, register a webauthn credential associated with the user account + try { + let cognitoUser = await Auth.signIn(username); + console.log("WebAuthnClient signUp() CognitoUser: ", cognitoUser); + + if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.get') { + + throw new WebAuthnClientException("User already exists. Please Sign In.", INVALID_CHALLENGE_TYPE); + + } else if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.create') { + + let challengeResponse = await getCreateCredentialChallegeResponse(cognitoUser.challengeParam); + console.log("WebAuthnClient signUp() challengeResponse: ", challengeResponse); + + let isUserVerified = getUVFromAttestation(challengeResponse.credential.response.attestationObject); + console.log("WebAuthnClient signUp() isUserVerified: ", isUserVerified); + + let pin = defaultInvalidPIN; + if (isUserVerified == false) { + console.log("WebAuthnClient signUp() requesting UV: "); + pin = requestUV(); + } + + console.log("WebAuthnClient signUp() sending challenge answer"); + let userData = await sendChallengeAnswer(cognitoUser, challengeResponse, pin); + console.log("WebAuthnClient signUp() userData: ",userData); + + return userData; + + } else { + console.error("WebAuthnClient signUp() error: throw WebAuthnClientException"); + throw new WebAuthnClientException("Invalid server response"); + } + } catch (error) { + console.error("WebAuthnClient signUp() error: ", error); + throw error; + } + +} \ No newline at end of file diff --git a/clients/web/react/src/_components/index.js b/clients/web/react/src/_components/index.js index ac15b75..9a43a37 100644 --- a/clients/web/react/src/_components/index.js +++ b/clients/web/react/src/_components/index.js @@ -1,3 +1,4 @@ export * from './PrivateRoute'; export * from './ServerVerifiedPin'; -export * from './IdentifierFirstFlow'; \ No newline at end of file +export * from './IdentifierFirstFlow'; +export * from './WebAuthnClient'; \ No newline at end of file From 838be18249e95e98c3753cddf7d04d0b093ffa09 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Thu, 18 Nov 2021 08:42:11 -0800 Subject: [PATCH 13/66] sign in flow with UV --- .../FIDO2KitAPI/FIDO2KitAPI.js | 6 + clients/web/react/src/App/App.jsx | 5 +- clients/web/react/src/HomePage/HomePage.jsx | 8 +- clients/web/react/src/LoginPage/LogInStep.js | 2 +- .../LoginPage/RegisterTrustedDeviceStep.js | 2 + .../IdentifierFirstSignUpFlow.jsx | 47 +++++ .../IdentifierFirstSignUpFlowPage.jsx | 14 ++ .../RegisterPage/RegisterKeySuccessStep.js | 86 +++++++++ .../src/RegisterPage/RegisterSvPinStep.js | 134 ++++++++++++++ .../web/react/src/RegisterPage/SignUpStep.js | 163 ++++++++++++++++++ clients/web/react/src/RegisterPage/index.js | 4 +- .../react/src/_components/WebAuthnClient.js | 139 +++++++++++---- 12 files changed, 569 insertions(+), 41 deletions(-) create mode 100644 clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.jsx create mode 100755 clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.jsx create mode 100644 clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js create mode 100644 clients/web/react/src/RegisterPage/RegisterSvPinStep.js create mode 100644 clients/web/react/src/RegisterPage/SignUpStep.js diff --git a/backend/lambda-functions/FIDO2KitAPI/FIDO2KitAPI.js b/backend/lambda-functions/FIDO2KitAPI/FIDO2KitAPI.js index e1c858d..ca904c6 100644 --- a/backend/lambda-functions/FIDO2KitAPI/FIDO2KitAPI.js +++ b/backend/lambda-functions/FIDO2KitAPI/FIDO2KitAPI.js @@ -424,6 +424,12 @@ async function finishRegisterFIDO2Credential(userName, body) { console.log("response: ", response); let payload = JSON.parse(response.Payload); console.log("response payload: ", payload); + + // exceptions will have a message property + if(payload.message !== undefined) { + console.log("error: "+ payload.message); + return error(new Error(payload.message)); + } return ok(payload); } catch (err) { diff --git a/clients/web/react/src/App/App.jsx b/clients/web/react/src/App/App.jsx index efc29a8..9f168e6 100644 --- a/clients/web/react/src/App/App.jsx +++ b/clients/web/react/src/App/App.jsx @@ -7,10 +7,10 @@ import { history } from '../_helpers'; import { alertActions } from '../_actions'; import { PrivateRoute } from '../_components'; import { HomePage } from '../HomePage'; -import { LoginPage } from '../LoginPage'; import { IdentifierFirstLoginFlowPage } from '../LoginPage'; import { LoginWithSecurityKeyPage } from '../LoginWithSecurityKeyPage'; import { RegisterPage } from '../RegisterPage'; +import { IdentifierFirstSignUpFlowPage } from '../RegisterPage'; import { IdentifierFirstFlowProto } from '../IdentifierFirstFlowProto'; import Amplify from 'aws-amplify'; @@ -46,8 +46,7 @@ function App() { - - + diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index f67333d..2d9c94b 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -246,7 +246,7 @@ function HomePage() { } }}/>
{ invalidNickname ? {invalidNickname} : null } -   
+   



@@ -450,6 +450,10 @@ function HomePage() { ); } + const logout = () => { + Auth.signOut(); + } + return ( <>

Hi {userInfo.attributes.name}!

@@ -459,7 +463,7 @@ function HomePage() { - Logout + Logout ); } diff --git a/clients/web/react/src/LoginPage/LogInStep.js b/clients/web/react/src/LoginPage/LogInStep.js index 286ca52..e61ffaf 100644 --- a/clients/web/react/src/LoginPage/LogInStep.js +++ b/clients/web/react/src/LoginPage/LogInStep.js @@ -94,7 +94,7 @@ const LogInStep = ({ navigation }) => { if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.create') { dispatch(alertActions.error("Please Sign Up")); - history.push('/login'); + history.push('/register'); return; } else if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.get') { diff --git a/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js b/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js index 023556d..aaac8ae 100644 --- a/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js +++ b/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js @@ -34,6 +34,7 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { console.error("RegisterTrustedDeviceStep register error"); console.error(err); dispatch(alertActions.error(err.message)); + return; } */ registerDeviceSuccessStep(); @@ -65,6 +66,7 @@ const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { console.error("RegisterTrustedDeviceStep authenticate error"); console.error(err); dispatch(alertActions.error(err.message)); + return; } continueStep(); diff --git a/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.jsx b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.jsx new file mode 100644 index 0000000..3ed28fe --- /dev/null +++ b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.jsx @@ -0,0 +1,47 @@ +import React from "react"; +import { useForm, useStep } from "react-hooks-helper"; + +import SignUpStep from "./SignUpStep"; +import RegisterSvPinStep from "./RegisterSvPinStep"; +import RegisterKeySuccessStep from "./RegisterKeySuccessStep"; + +const steps = [ + { id: "SignUpStep" }, + { id: "RegisterSvPinStep" }, + { id: "RegisterKeySuccessStep" } +]; + +const defaultData = { + username: localStorage.getItem('username'), + pin: -1, + nickname: "Security Key", + credential: localStorage.getItem('credential') + }; + +export const IdentifierFirstSignUpFlow = ({ images }) => { + const [formData, setForm] = useForm(defaultData); + const _initialStep = defaultData.credential == null ? 0 : 2; + const { step, navigation } = useStep({ initialStep: _initialStep, steps }); + const { id } = step; + const props = { formData, setForm, navigation }; + + const renderSwitch = (id) => { + switch (id) { + case "SignUpStep": + return ; + case "RegisterSvPinStep": + return ; + case "RegisterKeySuccessStep": + return ; + default: + return null; + } + }; + + return ( + <> + {renderSwitch(id)} + + ); + +} \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.jsx b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.jsx new file mode 100755 index 0000000..0084e21 --- /dev/null +++ b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.jsx @@ -0,0 +1,14 @@ +import React from 'react'; + +import { IdentifierFirstSignUpFlow } from '.'; + +function IdentifierFirstSignUpFlowPage() { + + return ( + <> + + + ); +} + +export { IdentifierFirstSignUpFlowPage }; \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js new file mode 100644 index 0000000..04c8449 --- /dev/null +++ b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js @@ -0,0 +1,86 @@ +import React from "react"; +import { Button, InputGroup, FormControl, } from 'react-bootstrap'; +import { useDispatch, useSelector } from 'react-redux'; + +import { history } from '../_helpers'; +import { WebAuthnClient } from '../_components'; +import { userActions, credentialActions, alertActions } from '../_actions'; + + +const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { + + const dispatch = useDispatch(); + + const { username, pin, nickname, credential } = formData; + + async function continueStep() { + let result = WebAuthnClient.validateCredentialNickname(nickname); + + if(result) { + + console.error("RegisterKeySuccessStep validateCredentialNickname error"); + let message = result.nickname.join(". "); + console.error(message); + dispatch(alertActions.error(message)); + + } else { + try { + await WebAuthnClient.getCurrentAuthenticatedUser(); + let ls_credential = JSON.parse(localStorage.getItem('credential')); + + let credentialToUpdate = { + credential: { + credentialId: { + base64: ls_credential.id + } + }, + credentialNickname: { + value: nickname + } + } + + dispatch(credentialActions.update(credentialToUpdate)); + + } catch (err) { + + console.error("RegisterKeySuccessStep continueStep() error"); + console.error(err); + dispatch(alertActions.error(err.message)); + + } + } + localStorage.removeItem('credential'); + history.push('/'); + } + + return ( + <> +
+

Security Key Added

+ +
+
+
+ + + + + + + +
+
+ +
+
+ + ); +}; + +export default RegisterKeySuccessStep; \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/RegisterSvPinStep.js b/clients/web/react/src/RegisterPage/RegisterSvPinStep.js new file mode 100644 index 0000000..2bfc91c --- /dev/null +++ b/clients/web/react/src/RegisterPage/RegisterSvPinStep.js @@ -0,0 +1,134 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; +import validate from 'validate.js'; + + +const RegisterSvPinStep = ({ setForm, formData, navigation }) => { + const [validated, setValidated] = useState(false); + + var constraints = { + pin: { + presence: true, + numericality: { + onlyInteger: true, + greaterThan: -1, + }, + length: { + minimum: 4, + maximum: 16 + } + }, + confirmPin: { + equality: "pin" + } + }; + + const [inputs, setInputs] = useState({ + username: localStorage.getItem('username'), + pin: '', + confirmPin: '' + }); + + const [errors, setErrors] = useState({ + pin: '', + confirmPin: '' + }); + + const accountSecurityStep = () => { + navigation.go('AccountSecurityStep'); + } + + const handleChange = (e) => { + const { name, value } = e.target; + setInputs(inputs => ({ ...inputs, [name]: value })); + + setValidated(false); + + const result = validate(inputs, constraints); + if (result) { + if (result[name]) { + setErrors(errors => ({ ...errors, [name]: result[name].join(". ") })); + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + } + } + + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + setValidated(true); + + if (isInputValid()) { + accountSecurityStep(); + } + } + + const isInputValid = () => { + if (validate(inputs, constraints)) { + return false; + } + return true; + } + + + return ( + <> +
+

Create your Server-Verified PIN

+ +
+
+ + + Server Verified PIN + + + + {errors.pin} + + + + + Confirm PIN             + + + + {errors.confirmPin} + + + +
+ + ); +}; + +export default RegisterSvPinStep; \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/SignUpStep.js b/clients/web/react/src/RegisterPage/SignUpStep.js new file mode 100644 index 0000000..9c69612 --- /dev/null +++ b/clients/web/react/src/RegisterPage/SignUpStep.js @@ -0,0 +1,163 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; +import { useDispatch, useSelector } from 'react-redux'; + +import { history } from '../_helpers'; +import { WebAuthnClient } from '../_components'; +import { userActions, credentialActions, alertActions } from '../_actions'; + +import validate from 'validate.js'; + + +const SignUpStep = ({ setForm, formData, navigation }) => { + + const dispatch = useDispatch(); + + const { username, pin, nickname, credential } = formData; + + const [errors, setErrors] = useState({ + username: '' + }); + const [validated, setValidated] = useState(false); + + const constraints = { + username: { + presence: true, + format: { + pattern: "[a-z0-9_\-]+", + flags: "i", + message: "can only contain a-z, 0-9, or _-" + }, + length: { + minimum: 3, + maximum: 20 + } + } + }; + + const LogInStep = () => { + history.push('/login'); + } + + async function register() { + console.log("register"); + + try { + let options = ""; // default = no platform or cross-platform preference + let userData = await WebAuthnClient.signUp(username, options, uv); + console.log("SignUpStep register userData: ", userData); + + if (userData === undefined) { + console.error("SignUpStep register error: userData undefined"); + dispatch(alertActions.error("Something went wrong. Please try again.")); + } else { + dispatch(alertActions.success('Registration successful')); + setForm({target: {name: "credential", value: userData.credential}}); + registerKeySuccessStep(userData.credential); + } + + } catch (err) { + console.error("SignUpStep register error"); + console.error(err); + dispatch(alertActions.error(err.message)); + } + } + + function uv() { + //This is a user verifying platform. Skipping UV check. + } + + const registerKeySuccessStep = (credential) => { + localStorage.setItem('credential', JSON.stringify(credential)); + console.log('registerKeySuccessStep credential ', credential); + history.push('/register'); + } + + const handleChange = (e) => { + const { name, value } = e.target; + setForm(e); + + const result = validate({ username: value }, constraints); + if (result) { + setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); + setValidated(false); + return; + } else { + setErrors(errors => ({ ...errors, [name]: undefined })); + setValidated(true); + } + } + + const handleSubmit = (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + setValidated(true); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + if(isUsernameValid()) { + register(); + } + } + + const isUsernameValid = () => { + if(validate({ username: username }, constraints)){ + return false; + } + return true; +} + + return ( + <> +
+

Welcome

+ +
+
+ + + + @ + + + + {errors.username} + + + +
+

Add Your Security Key

+ +
+
    +
  1. Make sure your Security Key is nearby
  2. +
  3. Follow the steps in the browser
  4. +
  5. Give your Security Key a nickname to easily identify it later
  6. +
+ +
+
+
+
+
+
Already have an account? Log In
+
+ + ); +}; + +export default SignUpStep; \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/index.js b/clients/web/react/src/RegisterPage/index.js index 1813bdb..004f05c 100644 --- a/clients/web/react/src/RegisterPage/index.js +++ b/clients/web/react/src/RegisterPage/index.js @@ -1 +1,3 @@ -export * from './RegisterPage'; \ No newline at end of file +export * from './RegisterPage'; +export * from './IdentifierFirstSignUpFlowPage'; +export * from './IdentifierFirstSignUpFlow'; \ No newline at end of file diff --git a/clients/web/react/src/_components/WebAuthnClient.js b/clients/web/react/src/_components/WebAuthnClient.js index b782552..7a88d49 100644 --- a/clients/web/react/src/_components/WebAuthnClient.js +++ b/clients/web/react/src/_components/WebAuthnClient.js @@ -1,7 +1,9 @@ -import { get, supported } from '@github/webauthn-json'; +import { get, create, supported } from '@github/webauthn-json'; import base64url from 'base64url'; +import cbor from 'cbor'; import { Auth } from 'aws-amplify'; import axios from 'axios'; +import validate from 'validate.js'; import aws_exports from '../aws-exports'; @@ -9,18 +11,28 @@ axios.defaults.baseURL = aws_exports.apiEndpoint; export const WebAuthnClient = { getAuthChallegeResponse, + getCurrentAuthenticatedUser, getPublicKeyRequestOptions, getUsernamelessAuthChallegeResponse, getUVFromAssertion, sendChallengeAnswer, signIn, - signUp + signUp, + updateCredential, + validateCredentialNickname }; const defaultInvalidPIN = -1; const webAuthnClientExceptionName = 'WebAuthnClientException'; const ERROR_CODE = "ERROR_CODE"; const INVALID_CHALLENGE_TYPE = "INVALID_CHALLENGE_TYPE"; +const constraints = { + nickname: { + length: { + maximum: 20 + } + } + }; function WebAuthnClientException(message, code = ERROR_CODE) { const error = new Error(message); @@ -215,38 +227,41 @@ async function sendChallengeAnswer(cognitoUser, challengeResponse, pin = default challengeResponse.pinCode = parseInt(pin); console.log("WebAuthnClient sendChallengeAnswer(): ", challengeResponse); - Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) - .then(user => { - console.log(user); - - Auth.currentSession() - .then(data => { - //TODO move dispatch to UI logic - //dispatch(alertActions.success('Authentication successful')); - let userData = { - id: 1, - username: user.attributes.name, - token: data.getAccessToken().getJwtToken() - } - localStorage.setItem('user', JSON.stringify(userData)); - console.log("userData ", localStorage.getItem('user')); - - return userData; - }) - .catch(err => { - console.error("WebAuthnClient sendChallengeAnswer currentSession() error: ", err); - //TODO move dispatch to UI logic - //dispatch(alertActions.error("Something went wrong. ", err.message)); - throw err; - }); - - }) - .catch(error => { - console.error("WebAuthnClient sendCustomChallengeAnswer() error: ", error); - //TODO move dispatch to UI logic - //dispatch(alertActions.error(err.message)); - throw error; + let userData = undefined; + + try { + let user = await Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)); + console.log("WebAuthnClient sendChallengeAnswer user: ", user); + + let currentUser = await Auth.currentAuthenticatedUser({ + bypassCache: true // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data }); + console.log("WebAuthnClient sendChallengeAnswer() currentAuthenticatedUser", currentUser); + + //let userSession = await Auth.userSession(user); + //console.log("WebAuthnClient sendChallengeAnswer() userSession", userSession); + window.location.reload(); + + + let data = await Auth.currentSession(); + console.log("WebAuthnClient sendChallengeAnswer data: ", data); + userData = { + id: 1, + username: user.username, + credential: challengeResponse.credential, + token: data.getAccessToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + console.log("WebAuthnClient sendChallengeAnswer userData: ", localStorage.getItem('user')); + + } catch (error) { + console.error("WebAuthnClient sendCustomChallengeAnswer() error: ", error); + //TODO move dispatch to UI logic + //dispatch(alertActions.error(err.message)); + throw error; + } + + return userData; } @@ -259,7 +274,7 @@ async function signUp(name, requestUV) { const password = randomString(14); const username = name.toLocaleLowerCase(); localStorage.setItem('username', username); - const attributes = { "name": username }; + const attributes = { name: username }; try { const { user } = await Auth.signUp({ @@ -311,4 +326,60 @@ async function signUp(name, requestUV) { throw error; } +} + +//todo move to user action/service +async function getCurrentAuthenticatedUser() { + let userData = undefined; + + try { + let currentUser = await Auth.currentAuthenticatedUser({ + bypassCache: true // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data + }); + console.log("getCurrentAuthenticatedUser currentAuthenticatedUser", currentUser); + + let data = await Auth.currentSession(); + console.log("getCurrentAuthenticatedUser data: ", data); + userData = { + id: 1, + username: currentUser.username, + credential: JSON.parse(localStorage.getItem('credential')), + token: data.getIdToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + axios.defaults.headers.common['Authorization'] = userData.token; + console.log("getCurrentAuthenticatedUser userData: ", localStorage.getItem('user')); + } catch (error) { + console.error("getCurrentAuthenticatedUser error: ", error); + throw error; + } + + return userData; +} + +//todo remove, alreayd exists in credential action/service +async function updateCredential(credential, credentialNickname) { + console.log("WebAuthnClient updateCredential() credential=", credential); + console.log("WebAuthnClient updateCredential() credentialNickname=", credentialNickname); + + try { + let data = await Auth.currentSession(); + + let jwt = data.getIdToken().getJwtToken(); + console.log("updateCredential jwt", jwt); + axios.defaults.headers.common['Authorization'] = jwt; + + const response = await axios.put('/users/credentials/fido2', {credential: { credentialId: { base64: credential.id}}, credentialNickname: { value: credentialNickname }}); + console.log(response); + return response.data; + } catch (error) { + console.error("WebAuthnClient updateCredential() error: ", error); + throw error; + } + +} + +//todo move to credential action/service +function validateCredentialNickname(nickname) { + return validate({nickname: nickname}, constraints); } \ No newline at end of file From 19b58bd4cb103f18ad227816d5582b8d3b4e1edd Mon Sep 17 00:00:00 2001 From: csalas Date: Thu, 18 Nov 2021 13:18:20 -0600 Subject: [PATCH 14/66] Logout flow created - will need to test with Cognito account --- .../src/_components/AccountSecurityStep.js | 14 +++++++++- .../src/_components/IdentifierFirstFlow.jsx | 6 ++++- .../web/react/src/_components/LogoutStep.js | 27 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 clients/web/react/src/_components/LogoutStep.js diff --git a/clients/web/react/src/_components/AccountSecurityStep.js b/clients/web/react/src/_components/AccountSecurityStep.js index 25084e3..403ec89 100644 --- a/clients/web/react/src/_components/AccountSecurityStep.js +++ b/clients/web/react/src/_components/AccountSecurityStep.js @@ -4,8 +4,20 @@ import { Button, Card, InputGroup, FormControl, Table } from 'react-bootstrap'; import styles from "./component.module.css"; const AccountSecurityStep = ({ setForm, formData, navigation }) => { + + //TODO Get trusted devices + + //TODO Get Security Keys + + //TODO Change SV-PIN + + //TODO Generate recovery codes + + //TODO Delete account + + //TODO Logout const logOut = () => { - window.location.reload(); + navigation.go('LogOutStep') } return ( diff --git a/clients/web/react/src/_components/IdentifierFirstFlow.jsx b/clients/web/react/src/_components/IdentifierFirstFlow.jsx index 2fdb6db..d733ba7 100644 --- a/clients/web/react/src/_components/IdentifierFirstFlow.jsx +++ b/clients/web/react/src/_components/IdentifierFirstFlow.jsx @@ -12,6 +12,7 @@ import LogInTrustedDeviceStep from "./LogInTrustedDeviceStep"; import RegisterKeySuccessStep from "./RegisterKeySuccessStep"; import RegisterDeviceSuccessStep from "./RegisterDeviceSuccessStep"; import AccountSecurityStep from "./AccountSecurityStep"; +import LogOutStep from "./LogoutStep"; const steps = [ { id: "LogInStep" }, @@ -23,7 +24,8 @@ const steps = [ { id: "LogInTrustedDeviceStep" }, { id: "RegisterKeySuccessStep" }, { id: "RegisterDeviceSuccessStep" }, - { id: "AccountSecurityStep" } + { id: "AccountSecurityStep" }, + { id: "LogOutStep"} ]; export const IdentifierFirstFlow = ({ images }) => { @@ -57,6 +59,8 @@ export const IdentifierFirstFlow = ({ images }) => { return ; case "AccountSecurityStep": return ; + case "LogOutStep": + return ; default: return null; } diff --git a/clients/web/react/src/_components/LogoutStep.js b/clients/web/react/src/_components/LogoutStep.js new file mode 100644 index 0000000..94761af --- /dev/null +++ b/clients/web/react/src/_components/LogoutStep.js @@ -0,0 +1,27 @@ +import React, { useEffect } from 'react'; +import { useDispatch } from 'react-redux'; +import { userActions } from '../_actions'; + +import { Spinner } from 'react-bootstrap'; + +const LogOutStep = ({ navigation }) => { + const dispatch = useDispatch(); + useEffect(() => { + setTimeout(function () { + console.log('Called into logout'); + dispatch(userActions.logout()); + navigation.go('LogInStep'); + }, 1000); + }, []); + + return ( + <> +
+ +

Thank you for joining us!

+
+ + ); +}; + +export default LogOutStep; From 9366bc69397508020e18ab911debc8c09d7db83e Mon Sep 17 00:00:00 2001 From: csalas Date: Thu, 18 Nov 2021 16:43:25 -0600 Subject: [PATCH 15/66] Added Credential Display component, still need specific methods --- .../src/_components/AccountSecurityStep.js | 114 ++++++++++++++---- .../src/_components/component.module.css | 17 +++ 2 files changed, 109 insertions(+), 22 deletions(-) diff --git a/clients/web/react/src/_components/AccountSecurityStep.js b/clients/web/react/src/_components/AccountSecurityStep.js index 403ec89..5b18186 100644 --- a/clients/web/react/src/_components/AccountSecurityStep.js +++ b/clients/web/react/src/_components/AccountSecurityStep.js @@ -1,13 +1,61 @@ -import React from "react"; -import { Button, Card, InputGroup, FormControl, Table } from 'react-bootstrap'; +import React, { useState, useEffect, useRef, Profiler } from 'react'; +import { Button, Card, InputGroup, FormControl, Table, ListGroup, Image, Container, Row, Col } from 'react-bootstrap'; +import { useDispatch, useSelector } from 'react-redux'; +import { userActions, credentialActions, alertActions } from '../_actions'; +import { WebAuthnClient } from './WebAuthnClient'; import styles from "./component.module.css"; const AccountSecurityStep = ({ setForm, formData, navigation }) => { + //Initialize User information + const [userData, setUserData] = useState({ + username: '', + token: '', + credential: '' + }); + const credentials = useSelector(state => state.credentials); + const dispatch = useDispatch(); + + useEffect(() => { + setUserData(WebAuthnClient.getCurrentAuthenticatedUser() || undefined); + console.log(`Username: ${userData.username}`); + console.log(`Token: ${userData.token}`); + console.log(`Credential: ${userData.credential}`); + }, []); + + useEffect(() => { + if(userData.token) { + console.log(`JWT: ${userData.token}`); + dispatch(credentialActions.getAll(jwt)); + } + }, [alert]) //TODO Get trusted devices //TODO Get Security Keys + //TODO - Modal for Edit + //TODO - Format date from response + //TODO - Use Metadata to determine if YubiKey (and what image do we use for non-YubiKey?) + function credentialDisplay(credential) { + return ( + <> + + + + + +
{credential.credentialNickname.value}
+
YubiKey 5NFC
+

{credential.lastUsedTime}

+ + + + +
+
+ + ); + } //TODO Change SV-PIN @@ -15,7 +63,6 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => { //TODO Delete account - //TODO Logout const logOut = () => { navigation.go('LogOutStep') } @@ -53,25 +100,48 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => {
Security Keys
- - - - - - - - - - - - - - - - - - -
YubiKey 5. Last used: May 26, 2021
YubiKey 4. Last used: April 26, 2021
YubiKey 6. Last used: March 26, 2021
+ + + + + +
Credential Nickname 1
+
YubiKey 5NFC
+

Last Login: Aug 25, 2021

+ + + + +
+
+ + + + + +
Credential Nickname 2
+
YubiKey 5NFC
+

Last Login: Aug 25, 2021

+ + + + +
+
+ + + + + +
Credential Nickname 3
+
YubiKey 5NFC
+

Last Login: Aug 25, 2021

+ + + + +
+
diff --git a/clients/web/react/src/_components/component.module.css b/clients/web/react/src/_components/component.module.css index 5e6072c..b89a1d8 100644 --- a/clients/web/react/src/_components/component.module.css +++ b/clients/web/react/src/_components/component.module.css @@ -23,4 +23,21 @@ .rcorners { border-radius: 25px; background-color: white; +} + +.security-key-image { + max-height: 70px; + border: 3px #e7e7e7 solid; + padding: 5px; + background-color: #9aca3c; +} + +.security-key-image-col { + justify-content: center; + display: flex; + align-items: center; +} + +.section-divider { + border-top: 2px #e7e7e7 solid; } \ No newline at end of file From 88eb5e208a999da6e57e2164f45b795cf03de6e4 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Fri, 19 Nov 2021 10:02:21 -0800 Subject: [PATCH 16/66] moved credential validation to credential.actions --- .../RegisterPage/RegisterKeySuccessStep.js | 72 +++++++++++-------- .../react/src/_actions/credential.actions.js | 48 +++++++++++-- .../react/src/_components/WebAuthnClient.js | 40 +---------- .../src/_constants/credential.constants.js | 6 +- .../src/_reducers/credentials.reducer.js | 16 +++++ .../react/src/_services/credential.service.js | 1 + 6 files changed, 106 insertions(+), 77 deletions(-) diff --git a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js index 04c8449..168f1b4 100644 --- a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js +++ b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState, useEffect, useRef, Profiler } from 'react'; import { Button, InputGroup, FormControl, } from 'react-bootstrap'; import { useDispatch, useSelector } from 'react-redux'; @@ -11,46 +11,56 @@ const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { const dispatch = useDispatch(); + const validNickname = useSelector(state => state.credentials.validNickname); + const updateComplete = useSelector(state => state.credentials.updateComplete); + + useEffect(() => { + if (validNickname){ + updateCredential(validNickname); + } + },[validNickname]); + + useEffect(() => { + if (updateComplete) { + history.push('/'); + } + },[updateComplete]); + const { username, pin, nickname, credential } = formData; - async function continueStep() { - let result = WebAuthnClient.validateCredentialNickname(nickname); - - if(result) { - - console.error("RegisterKeySuccessStep validateCredentialNickname error"); - let message = result.nickname.join(". "); - console.error(message); - dispatch(alertActions.error(message)); - - } else { - try { - await WebAuthnClient.getCurrentAuthenticatedUser(); - let ls_credential = JSON.parse(localStorage.getItem('credential')); - - let credentialToUpdate = { - credential: { - credentialId: { - base64: ls_credential.id - } - }, - credentialNickname: { - value: nickname + async function updateCredential(nickname){ + console.log("RegisterKeySuccessStep updateCredential() nickname:", nickname); + try { + await WebAuthnClient.getCurrentAuthenticatedUser(); // Get the jwt token after signup + let ls_credential = JSON.parse(localStorage.getItem('credential')); + console.log("RegisterKeySuccessStep updateCredential() ls_credential:", ls_credential); + + let credentialToUpdate = { + credential: { + credentialId: { + base64: ls_credential.id } + }, + credentialNickname: { + value: nickname } + } - dispatch(credentialActions.update(credentialToUpdate)); + dispatch(credentialActions.update(credentialToUpdate)); - } catch (err) { + } catch (err) { - console.error("RegisterKeySuccessStep continueStep() error"); - console.error(err); - dispatch(alertActions.error(err.message)); + console.error("RegisterKeySuccessStep continueStep() error"); + console.error(err); + dispatch(alertActions.error(err.message)); - } } localStorage.removeItem('credential'); - history.push('/'); + + } + + function continueStep() { + dispatch(credentialActions.validateCredentialNickname(nickname)); } return ( diff --git a/clients/web/react/src/_actions/credential.actions.js b/clients/web/react/src/_actions/credential.actions.js index 2595d84..80e3f43 100644 --- a/clients/web/react/src/_actions/credential.actions.js +++ b/clients/web/react/src/_actions/credential.actions.js @@ -1,7 +1,7 @@ import { credentialConstants } from '../_constants'; import { credentialService } from '../_services'; import { alertActions } from '.'; -import { history } from '../_helpers'; +import validate from 'validate.js'; export const credentialActions = { generateRecoveryCodes, @@ -13,9 +13,18 @@ export const credentialActions = { getAll, getUV, completeUV, - delete: _delete + delete: _delete, + validateCredentialNickname }; +const constraints = { + nickname: { + length: { + maximum: 20 + } + } + }; + function generateRecoveryCodes() { return dispatch => { dispatch(request()); @@ -24,7 +33,6 @@ function generateRecoveryCodes() { .then( data => { dispatch(success(data)); - //dispatch(alertActions.success('Recovery Code generation successful')); }, error => { dispatch(failure(error.toString())); @@ -46,7 +54,6 @@ function listRecoveryCodes() { .then( count => { dispatch(success(count)); - //dispatch(alertActions.success('Recovery Code generation successful')); }, error => { dispatch(failure(error.toString())); @@ -132,8 +139,14 @@ function registerFinish(registration) { credentialService.registerFinish(registration) .then( registration => { - dispatch(success(registration)); - dispatch(alertActions.success('Registration successful')); + console.log("credential.actions registerFinish registration: ", registration); + if (registration === undefined) { + dispatch(failure('Registration failed')); + dispatch(alertActions.error('Registration failed')); + } else { + dispatch(success(registration)); + dispatch(alertActions.success('Registration successful')); + } }, error => { dispatch(failure(error.toString())); @@ -208,7 +221,6 @@ function _delete(id) { }, error => { dispatch(failure(id, error.toString())); - //dispatch(alertActions.error(error.toString())); } ); }; @@ -218,3 +230,25 @@ function _delete(id) { function failure(id, error) { return { type: credentialConstants.DELETE_FAILURE, id, error } } } +function validateCredentialNickname(nickname) { + return dispatch => { + dispatch(request(nickname)); + + let result = validate({nickname: nickname}, constraints); + + if(result) { + + let error = result.nickname.join(". "); + dispatch(failure(error.toString())); + dispatch(alertActions.error(error.toString())); + + } else { + dispatch(success(nickname)); + } + + }; + + function request(nickname) { return { type: credentialConstants.NICKNAME_REQUEST, nickname } } + function success(nickname) { return { type: credentialConstants.NICKNAME_SUCCESS, nickname } } + function failure(nickname, error) { return { type: credentialConstants.NICKNAME_FAILURE, nickname, error } } +} diff --git a/clients/web/react/src/_components/WebAuthnClient.js b/clients/web/react/src/_components/WebAuthnClient.js index 7a88d49..81bf7ea 100644 --- a/clients/web/react/src/_components/WebAuthnClient.js +++ b/clients/web/react/src/_components/WebAuthnClient.js @@ -3,7 +3,6 @@ import base64url from 'base64url'; import cbor from 'cbor'; import { Auth } from 'aws-amplify'; import axios from 'axios'; -import validate from 'validate.js'; import aws_exports from '../aws-exports'; @@ -17,22 +16,14 @@ export const WebAuthnClient = { getUVFromAssertion, sendChallengeAnswer, signIn, - signUp, - updateCredential, - validateCredentialNickname + signUp }; const defaultInvalidPIN = -1; const webAuthnClientExceptionName = 'WebAuthnClientException'; const ERROR_CODE = "ERROR_CODE"; const INVALID_CHALLENGE_TYPE = "INVALID_CHALLENGE_TYPE"; -const constraints = { - nickname: { - length: { - maximum: 20 - } - } - }; + function WebAuthnClientException(message, code = ERROR_CODE) { const error = new Error(message); @@ -356,30 +347,3 @@ async function getCurrentAuthenticatedUser() { return userData; } - -//todo remove, alreayd exists in credential action/service -async function updateCredential(credential, credentialNickname) { - console.log("WebAuthnClient updateCredential() credential=", credential); - console.log("WebAuthnClient updateCredential() credentialNickname=", credentialNickname); - - try { - let data = await Auth.currentSession(); - - let jwt = data.getIdToken().getJwtToken(); - console.log("updateCredential jwt", jwt); - axios.defaults.headers.common['Authorization'] = jwt; - - const response = await axios.put('/users/credentials/fido2', {credential: { credentialId: { base64: credential.id}}, credentialNickname: { value: credentialNickname }}); - console.log(response); - return response.data; - } catch (error) { - console.error("WebAuthnClient updateCredential() error: ", error); - throw error; - } - -} - -//todo move to credential action/service -function validateCredentialNickname(nickname) { - return validate({nickname: nickname}, constraints); -} \ No newline at end of file diff --git a/clients/web/react/src/_constants/credential.constants.js b/clients/web/react/src/_constants/credential.constants.js index 3d7e6f7..2fed621 100644 --- a/clients/web/react/src/_constants/credential.constants.js +++ b/clients/web/react/src/_constants/credential.constants.js @@ -28,5 +28,9 @@ export const credentialConstants = { DELETE_REQUEST: 'CREDENTIAL_DELETE_REQUEST', DELETE_SUCCESS: 'CREDENTIAL_DELETE_SUCCESS', - DELETE_FAILURE: 'CREDENTIAL_DELETE_FAILURE' + DELETE_FAILURE: 'CREDENTIAL_DELETE_FAILURE', + + NICKNAME_REQUEST: 'CREDENTIAL_NICKNAME_REQUEST', + NICKNAME_SUCCESS: 'CREDENTIAL_NICKNAME_SUCCESS', + NICKNAME_FAILURE: 'CREDENTIAL_NICKNAME_FAILURE' }; diff --git a/clients/web/react/src/_reducers/credentials.reducer.js b/clients/web/react/src/_reducers/credentials.reducer.js index 5487b2e..a744ac8 100644 --- a/clients/web/react/src/_reducers/credentials.reducer.js +++ b/clients/web/react/src/_reducers/credentials.reducer.js @@ -78,6 +78,22 @@ export function credentials(state = {}, action) { return { error: action.error }; + case credentialConstants.NICKNAME_SUCCESS: + return { + validNickname: action.nickname + }; + case credentialConstants.NICKNAME_FAILURE: + return { + error: action.error + }; + case credentialConstants.UPDATE_SUCCESS: + return { + updateComplete: action.type + }; + case credentialConstants.UPDATE_FAILURE: + return { + updateComplete: action.type + }; default: return state } diff --git a/clients/web/react/src/_services/credential.service.js b/clients/web/react/src/_services/credential.service.js index fb5c320..5259c2f 100644 --- a/clients/web/react/src/_services/credential.service.js +++ b/clients/web/react/src/_services/credential.service.js @@ -17,6 +17,7 @@ export const credentialService = { delete: _delete }; + async function generateRecoveryCodes() { try { const response = await axios.delete('/users/credentials/codes'); From f353cfbb8cdb1ad0d9bbece9c8d3c463389f889e Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Fri, 19 Nov 2021 10:41:09 -0800 Subject: [PATCH 17/66] move get current user to user actions --- .../RegisterPage/RegisterKeySuccessStep.js | 6 ++-- .../web/react/src/_actions/user.actions.js | 23 +++++++++++++- .../react/src/_components/WebAuthnClient.js | 30 ------------------- .../react/src/_constants/user.constants.js | 6 +++- .../web/react/src/_services/user.service.js | 28 ++++++++++++++++- 5 files changed, 58 insertions(+), 35 deletions(-) diff --git a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js index 168f1b4..9f5fc4c 100644 --- a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js +++ b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js @@ -3,7 +3,6 @@ import { Button, InputGroup, FormControl, } from 'react-bootstrap'; import { useDispatch, useSelector } from 'react-redux'; import { history } from '../_helpers'; -import { WebAuthnClient } from '../_components'; import { userActions, credentialActions, alertActions } from '../_actions'; @@ -14,6 +13,10 @@ const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { const validNickname = useSelector(state => state.credentials.validNickname); const updateComplete = useSelector(state => state.credentials.updateComplete); + useEffect(() => { + dispatch(userActions.getCurrentAuthenticatedUser()); // Get the jwt token after signup + }, []); + useEffect(() => { if (validNickname){ updateCredential(validNickname); @@ -31,7 +34,6 @@ const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { async function updateCredential(nickname){ console.log("RegisterKeySuccessStep updateCredential() nickname:", nickname); try { - await WebAuthnClient.getCurrentAuthenticatedUser(); // Get the jwt token after signup let ls_credential = JSON.parse(localStorage.getItem('credential')); console.log("RegisterKeySuccessStep updateCredential() ls_credential:", ls_credential); diff --git a/clients/web/react/src/_actions/user.actions.js b/clients/web/react/src/_actions/user.actions.js index 878ea2a..6c9a233 100644 --- a/clients/web/react/src/_actions/user.actions.js +++ b/clients/web/react/src/_actions/user.actions.js @@ -7,7 +7,8 @@ export const userActions = { webAuthnStart, logout, exists, - delete: _delete + delete: _delete, + getCurrentAuthenticatedUser }; function webAuthnStart() { @@ -77,4 +78,24 @@ function _delete(jwt) { function request() { return { type: userConstants.DELETE_REQUEST } } function success() { return { type: userConstants.DELETE_SUCCESS } } function failure(error) { return { type: userConstants.DELETE_FAILURE, error } } +} + +function getCurrentAuthenticatedUser() { + return dispatch => { + dispatch(request()); + + userService.getCurrentAuthenticatedUser() + .then( + user => { + dispatch(success(user)); + }, + error => { + dispatch(failure(error)); + } + ); + }; + + function request() { return { type: userConstants.CURRENT_USER_REQUEST } } + function success(user) { return { type: userConstants.CURRENT_USER_SUCCESS, user } } + function failure(error) { return { type: userConstants.CURRENT_USER_FAILURE, error } } } \ No newline at end of file diff --git a/clients/web/react/src/_components/WebAuthnClient.js b/clients/web/react/src/_components/WebAuthnClient.js index 81bf7ea..89a0442 100644 --- a/clients/web/react/src/_components/WebAuthnClient.js +++ b/clients/web/react/src/_components/WebAuthnClient.js @@ -10,7 +10,6 @@ axios.defaults.baseURL = aws_exports.apiEndpoint; export const WebAuthnClient = { getAuthChallegeResponse, - getCurrentAuthenticatedUser, getPublicKeyRequestOptions, getUsernamelessAuthChallegeResponse, getUVFromAssertion, @@ -318,32 +317,3 @@ async function signUp(name, requestUV) { } } - -//todo move to user action/service -async function getCurrentAuthenticatedUser() { - let userData = undefined; - - try { - let currentUser = await Auth.currentAuthenticatedUser({ - bypassCache: true // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data - }); - console.log("getCurrentAuthenticatedUser currentAuthenticatedUser", currentUser); - - let data = await Auth.currentSession(); - console.log("getCurrentAuthenticatedUser data: ", data); - userData = { - id: 1, - username: currentUser.username, - credential: JSON.parse(localStorage.getItem('credential')), - token: data.getIdToken().getJwtToken() - } - localStorage.setItem('user', JSON.stringify(userData)); - axios.defaults.headers.common['Authorization'] = userData.token; - console.log("getCurrentAuthenticatedUser userData: ", localStorage.getItem('user')); - } catch (error) { - console.error("getCurrentAuthenticatedUser error: ", error); - throw error; - } - - return userData; -} diff --git a/clients/web/react/src/_constants/user.constants.js b/clients/web/react/src/_constants/user.constants.js index e5457fa..38cc5ea 100644 --- a/clients/web/react/src/_constants/user.constants.js +++ b/clients/web/react/src/_constants/user.constants.js @@ -39,5 +39,9 @@ export const userConstants = { DELETE_REQUEST: 'USERS_DELETE_REQUEST', DELETE_SUCCESS: 'USERS_DELETE_SUCCESS', - DELETE_FAILURE: 'USERS_DELETE_FAILURE' + DELETE_FAILURE: 'USERS_DELETE_FAILURE', + + CURRENT_USER_REQUEST: 'CURRENT_USER_REQUEST', + CURRENT_USER_SUCCESS: 'CURRENT_USER_SUCCESS', + CURRENT_USER_FAILURE: 'CURRENT_USER_FAILURE' }; diff --git a/clients/web/react/src/_services/user.service.js b/clients/web/react/src/_services/user.service.js index e1dfe77..e4e081f 100644 --- a/clients/web/react/src/_services/user.service.js +++ b/clients/web/react/src/_services/user.service.js @@ -11,7 +11,8 @@ export const userService = { webAuthnStart, logout, exists, - delete: _delete + delete: _delete, + getCurrentAuthenticatedUser }; async function webAuthnStart() { @@ -64,6 +65,31 @@ async function _delete(jwt) { } } +async function getCurrentAuthenticatedUser() { + + try { + let currentUser = await Auth.currentAuthenticatedUser({ + bypassCache: true // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data + }); + console.log("getCurrentAuthenticatedUser currentAuthenticatedUser", currentUser); + + let data = await Auth.currentSession(); + console.log("getCurrentAuthenticatedUser data: ", data); + let userData = { + id: 1, + username: currentUser.username, + credential: JSON.parse(localStorage.getItem('credential')), + token: data.getIdToken().getJwtToken() + } + localStorage.setItem('user', JSON.stringify(userData)); + axios.defaults.headers.common['Authorization'] = userData.token; + return userData; + } catch (error) { + Promise.reject(error); + } + +} + function _error(response) { return Promise.reject(JSON.stringify(response)); } From 67d8974277d227c0e6346ee7df2180b4c126a308 Mon Sep 17 00:00:00 2001 From: csalas Date: Fri, 19 Nov 2021 12:59:40 -0600 Subject: [PATCH 18/66] Changes to key detail, and addition of codes, and delete user componenets --- .../src/_components/AccountSecurityStep.js | 314 ++++++++++++++---- .../src/_components/IdentifierFirstFlow.jsx | 2 +- .../web/react/src/_components/LogoutStep.js | 6 +- 3 files changed, 245 insertions(+), 77 deletions(-) diff --git a/clients/web/react/src/_components/AccountSecurityStep.js b/clients/web/react/src/_components/AccountSecurityStep.js index 5b18186..b43fec7 100644 --- a/clients/web/react/src/_components/AccountSecurityStep.js +++ b/clients/web/react/src/_components/AccountSecurityStep.js @@ -1,10 +1,11 @@ import React, { useState, useEffect, useRef, Profiler } from 'react'; -import { Button, Card, InputGroup, FormControl, Table, ListGroup, Image, Container, Row, Col } from 'react-bootstrap'; +import { Button, Card, InputGroup, FormControl, Table, ListGroup, Image, Container, Row, Col, Modal, Alert } from 'react-bootstrap'; import { useDispatch, useSelector } from 'react-redux'; import { userActions, credentialActions, alertActions } from '../_actions'; import { WebAuthnClient } from './WebAuthnClient'; import styles from "./component.module.css"; +import Auth from '@aws-amplify/auth'; const AccountSecurityStep = ({ setForm, formData, navigation }) => { //Initialize User information @@ -13,7 +14,28 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => { token: '', credential: '' }); - const credentials = useSelector(state => state.credentials); + //const credentials = useSelector(state => state.credentials); + const credentials = [ + { + credentialNickname: 'My BIO Key', + lastUsedTime: 'Aug 25, 2021', + lastUpdatedTime: 'Sept 12, 2021', + registrationTime: 'July 23, 2021' + }, + { + credentialNickname: 'My 5Ci Key', + lastUsedTime: 'Aug 25, 2021', + lastUpdatedTime: 'Sept 12, 2021', + registrationTime: 'July 23, 2021' + }, + { + credentialNickname: 'My 5NFC Key', + lastUsedTime: 'Aug 25, 2021', + lastUpdatedTime: 'Sept 12, 2021', + registrationTime: 'July 23, 2021' + } + ]; + const dispatch = useDispatch(); useEffect(() => { @@ -26,7 +48,7 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => { useEffect(() => { if(userData.token) { console.log(`JWT: ${userData.token}`); - dispatch(credentialActions.getAll(jwt)); + //dispatch(credentialActions.getAll(jwt)); } }, [alert]) @@ -36,22 +58,80 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => { //TODO - Modal for Edit //TODO - Format date from response //TODO - Use Metadata to determine if YubiKey (and what image do we use for non-YubiKey?) - function credentialDisplay(credential) { + /** + * To put in final render use this + * credentials.items.map((credential, index) => {credentialDisplay(credential)} /> + */ + function CredentialDisplay(credential) { + + function EditModal() { + const [show, setShow] = useState(false); + + const handleClose = () => setShow(false); + const handleShow = () => setShow(true); + + //TODO implement this feature + const handleSave = () => { + console.log("Save called") + } + + //TODO uncomment the dispatch and test if this still works + const handleDelete = () => { + setShow(false); + console.log("Delete called"); + //dispatch(credentialActions.delete(credential.credential.credentialId.base64)); + } + + //Todo, make an edit field for the username (see if the constraints are in any of the helpers) + return ( + <> + + + + + Edit {credential.credentialNickname} + + + + + **placeholder for edit nickname** + + + Last Used Time: {credential.lastUsedTime} + + + Last Updated Time: {credential.lastUpdatedTime} + + + Registration Time: {credential.registrationTime} + + + + + + + + + + + ); + } + return ( <> - - - - - -
{credential.credentialNickname.value}
+
+
+ +
+
+
{credential.credentialNickname}
YubiKey 5NFC
-

{credential.lastUsedTime}

- - - - - +

{credential.lastUsedTime}

+
+
+ +
+

); @@ -60,10 +140,151 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => { //TODO Change SV-PIN //TODO Generate recovery codes + function RecoveryCodes() { + //let recoveryCodesViewed = credentials.recoveryCodesViewed; //For Cody's reference, this is found in FIDO2KitAPI, gets added to the payload + //let allRecoveryCodesUsed = credentials.allRecoveryCodesUsed; + //const recoveryCodes = useSelector(state => state.recoveryCodes); + let recoveryCodesViewed = false + let allRecoveryCodesUsed = false; + const recoveryCodes = { + loading: false, + generating: false, + error: '', + codesRemaining: 3, + codes: [ + '5e010f7cde664f98a8c003e220ff0084', + 'e2ef5f92c32a427885795af52c2ddaea', + '53d7a9899a7947dd8646d481baee685e', + '510afd0c813c45df87116275588c067b', + '510afd0c813c45df87116275588c067b' + ] + } + const [showCodes, setShowCodes] = useState(false); + + const handleClose = () => { + setShowCodes(false); + } + const handleShow = () => { + setShowCodes(true); + //dispatch(credentialActions.recoveryCodesViewed()); + } + const handleGenerate = () => { + setShowCodes(true); + //dispatch(credentialActions.generateRecoveryCodes()); + } + + useEffect(() => { + if(recoveryCodesViewed === false || allRecoveryCodesUsed) { + handleShow(); + } + }, [recoveryCodesViewed, allRecoveryCodesUsed]); + + return ( + <> + +
Recovery Options
+ + + +
+ + + Recovery Codes + + + + If you lose you all your authenticators and don't have the recovery codes you will lose access to your account. + {recoveryCodes.loading && Loading recovery codes...} + {recoveryCodes.generating && Generating recovery codes...} + {recoveryCodes.error && ERROR: {recoveryCodes.error}} + {recoveryCodes.codesRemaining && (recoveryCodes.codesRemaining === 0) ? Please generate new recovery codes now. : ''} + {recoveryCodes.codes && +
    +
  • {recoveryCodes.codes[0]}
  • +
  • {recoveryCodes.codes[1]}
  • +
  • {recoveryCodes.codes[2]}
  • +
  • {recoveryCodes.codes[3]}
  • +
  • {recoveryCodes.codes[4]}
  • +
+ } + {recoveryCodes.codes && Save your recovery codes now. They will not be shown again.} + {recoveryCodes.codesRemaining && (recoveryCodes.codesRemaining > 0) ? {recoveryCodes.codesRemaining} recovery codes remaining. : ''} + {allRecoveryCodesUsed && (!recoveryCodes.generating || !recoveryCodes.codes) && All recovery codes have been used. Please generate new recovery codes now.} +

+
Generate new recovery codes
+ + +
+ + + +
+ + ) + } + + function DeleteUser() { + const [show, setShow] = useState(false); + const handleShow = () => { + setShow(true); + } + const handleClose = () => { + setShow(false); + } + const handleDelete = () => { + navigation.go('LogOutStep'); + } + /** + const handleDelete = () => { + setShow(false); + Auth.currentAuthenticatedUser().then((user) => new Promise((resolve, reject) => { + user.deleteUser(error => { + if(error) { + return reject(error); + } + dispatch(userActions.delete(userData.token)); + navigation.go('LogOutStep'); + + resolve(); + }); + })) + .catch(error => { + console.error(error); + dispatch(alertActions.error(error.message)); + }); + } + */ - //TODO Delete account + return ( + <> + +
Delete Account
+ + + +
+ + + Delete Account + + + + + + + + + + + ); + } const logOut = () => { + dispatch(userActions.logout()); navigation.go('LogOutStep') } @@ -100,48 +321,9 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => {
Security Keys
- - - - - -
Credential Nickname 1
-
YubiKey 5NFC
-

Last Login: Aug 25, 2021

- - - - -
-
- - - - - -
Credential Nickname 2
-
YubiKey 5NFC
-

Last Login: Aug 25, 2021

- - - - -
-
- - - - - -
Credential Nickname 3
-
YubiKey 5NFC
-

Last Login: Aug 25, 2021

- - - - -
-
+ {credentials.map((credential, index) => + + )}
@@ -184,18 +366,8 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => { - -
Recovery Options
- - - -
- -
Delete Account
- - - -
+ +

diff --git a/clients/web/react/src/_components/IdentifierFirstFlow.jsx b/clients/web/react/src/_components/IdentifierFirstFlow.jsx index d733ba7..7cafa5f 100644 --- a/clients/web/react/src/_components/IdentifierFirstFlow.jsx +++ b/clients/web/react/src/_components/IdentifierFirstFlow.jsx @@ -35,7 +35,7 @@ export const IdentifierFirstFlow = ({ images }) => { const { id } = step; - const props = { navigation }; + const props = { navigation, step }; const renderSwitch = (id) => { switch (id) { diff --git a/clients/web/react/src/_components/LogoutStep.js b/clients/web/react/src/_components/LogoutStep.js index 94761af..43ad6ca 100644 --- a/clients/web/react/src/_components/LogoutStep.js +++ b/clients/web/react/src/_components/LogoutStep.js @@ -1,15 +1,11 @@ import React, { useEffect } from 'react'; -import { useDispatch } from 'react-redux'; -import { userActions } from '../_actions'; import { Spinner } from 'react-bootstrap'; const LogOutStep = ({ navigation }) => { - const dispatch = useDispatch(); useEffect(() => { setTimeout(function () { - console.log('Called into logout'); - dispatch(userActions.logout()); + console.log('Called into loader'); navigation.go('LogInStep'); }, 1000); }, []); From ee8c61fc2e368f0716c3a0c738efabbeef8b92ce Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 22 Nov 2021 11:20:16 -0700 Subject: [PATCH 19/66] Added changes to Home, and broke Credentials, DeleteUser, and Recovery codes to their own component --- clients/web/react/src/HomePage/HomePage.jsx | 532 ++++-------------- .../src/_components/AccountSecurityStep.js | 2 +- .../_components/Credential/AddCredential.jsx | 194 +++++++ .../src/_components/Credential/Credential.jsx | 36 ++ .../_components/Credential/CredentialList.jsx | 25 + .../_components/Credential/EditCredential.jsx | 160 ++++++ .../react/src/_components/Credential/index.js | 1 + .../src/_components/DeleteUser/DeleteUser.jsx | 64 +++ .../react/src/_components/DeleteUser/index.js | 1 + .../RecoveryCodes/RecoveryCodes.jsx | 117 ++++ .../src/_components/RecoveryCodes/index.js | 1 + 11 files changed, 707 insertions(+), 426 deletions(-) create mode 100644 clients/web/react/src/_components/Credential/AddCredential.jsx create mode 100644 clients/web/react/src/_components/Credential/Credential.jsx create mode 100644 clients/web/react/src/_components/Credential/CredentialList.jsx create mode 100644 clients/web/react/src/_components/Credential/EditCredential.jsx create mode 100644 clients/web/react/src/_components/Credential/index.js create mode 100644 clients/web/react/src/_components/DeleteUser/DeleteUser.jsx create mode 100644 clients/web/react/src/_components/DeleteUser/index.js create mode 100644 clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx create mode 100644 clients/web/react/src/_components/RecoveryCodes/index.js diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 2d9c94b..64a8b04 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -1,15 +1,12 @@ -import React, { useState, useEffect, useRef, Profiler } from 'react'; -import { Link } from 'react-router-dom'; +import React, { useState, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { userActions, credentialActions, alertActions } from '../_actions'; -import { history } from '../_helpers'; -import { ServerVerifiedPin } from '../_components'; +import { CredentialList } from '../_components/Credential'; +import { RecoveryCodes } from '../_components/RecoveryCodes'; +import { DeleteUser } from '../_components/DeleteUser'; -import { create, supported } from '@github/webauthn-json'; -import { Button, Modal, Form, Alert } from 'react-bootstrap'; -import base64url from 'base64url'; -import cbor from 'cbor'; +import { Button, InputGroup, Card, Table, FormControl } from 'react-bootstrap'; import { Auth } from 'aws-amplify'; import axios from 'axios'; import aws_exports from '../aws-exports'; @@ -20,16 +17,17 @@ axios.defaults.baseURL = aws_exports.apiEndpoint; function HomePage() { const [userInfo, setUserInfo] = useState({ - attributes: {}, id: "", - username: "" + username: "", + credential: "", + token: '' }); const credentials = useSelector(state => state.credentials); const alert = useSelector(state => state.alert); - const [jwt, setJwt] = useState(undefined); const svpinChangeProps = {type: "change", saveCallback: updatePin}; const dispatch = useDispatch(); + //To re-evaluate later function updatePin(fields) { dispatch(credentialActions.updatePin(fields)); } @@ -39,432 +37,116 @@ function HomePage() { }, []); useEffect(() => { - if(jwt) { - dispatch(credentialActions.getAll(jwt)); + if(userInfo.token) { + dispatch(credentialActions.getAll(userInfo.token)); } }, [alert]); function currentAuthenticatedUser() { - Auth.currentAuthenticatedUser() - .then(info => { - console.log("currentAuthUser", info); - setUserInfo(info); - }) - .catch(err => { - console.log(err); - dispatch(alertActions.error(err.message)); - }); - - Auth.currentSession().then(res => { - let idToken = res.getIdToken(); - let idJwt = idToken.getJwtToken(); - setJwt(idJwt); - console.log(`myJwt: ${idJwt}`); - dispatch(credentialActions.getAll(idJwt)); - }) - } - - function getUV(attestationObject) { - let attestationBuffer = base64url.toBuffer(attestationObject); - let attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; - let buffer = attestationStruct.authData; - - let flagsBuf = buffer.slice(32, 33); - let flagsInt = flagsBuf[0]; - let flags = { - up: !!(flagsInt & 0x01), - uv: !!(flagsInt & 0x04), - at: !!(flagsInt & 0x40), - ed: !!(flagsInt & 0x80), - flagsInt - }; - return flags.uv; + const currAuthUser = (dispatch(userActions.getCurrentAuthenticatedUser) || undefined); + console.log("Home currentAuthenticatedUser: ", currAuthUser) + + if (currAuthUser === undefined) { + console.error("Home currentAuthenticatedUser error"); + dispatch(alertActions.error("Something went wrong. Please try again.")); + } else { + dispatch(alertActions.success('Home currentAuthenticatedUser successful')); + setUserInfo(currAuthUser); + dispatch(credentialActions.getAll(userInfo.token)); + } } - - function Credentials() { - // Edit Credential - const [show, setShow] = useState(false); - const [nickname, setNickname] = useState(''); - const [credential, setCredential] = useState(''); - const [attestationMetadata, setAttestationMetadata] = useState(''); - const [invalidNickname, setInvalidNickname] = useState(undefined); - const [submitted, setSubmitted] = useState(false); - const defaultInvalidPIN = -1; - var constraints = { - nickname: { - length: { - maximum: 20 - } - } - }; - - const handleClose = () => setShow(false); - const handleCancel = () => setShow(false); - const handleDelete = () => { - setShow(false); - dispatch(credentialActions.delete(credential.credential.credentialId.base64)); - } - const handleSave = () => { - setSubmitted(true); - let result = validate({nickname: nickname}, constraints); - if(result) { - setInvalidNickname(result.nickname.join(". ")); - return result; - } else { - setInvalidNickname(undefined); - } - - setShow(false); - credential.credentialNickname.value = nickname; - dispatch(credentialActions.update(credential)); - } - const handleShow = (credential) => { - setNickname(credential.credentialNickname.value); - setCredential(credential); - setAttestationMetadata(credential.attestationMetadata.value); - setShow(true); - } - const handleChange = (e) => { - const { name, value } = e.target; - setNickname(value); - } - - // Add Credential - const [showAdd, setShowAdd] = useState(false); - const [isResidentKey, setIsResidentKey] = useState(false); - const handleCloseAdd = () => setShowAdd(false); - const handleCancelAdd = () => setShowAdd(false); - const handleSaveAdd = () => { - setShowAdd(false); - register(); - } - const handleShowAdd = () => { - setNickname(''); - setShowAdd(true); - } - const handleCheckboxChange = (e) => { - const target = e.target; - const value = target.type === 'checkbox' ? target.checked : target.value; - setIsResidentKey(value); - } - const register = () => { - console.log("register"); - setSubmitted(true); - console.log("nickname: ", nickname); - - axios.post('/users/credentials/fido2/register', {"nickname": nickname, "requireResidentKey": isResidentKey}) - .then( startRegistrationResponse => { - console.log(startRegistrationResponse); - - const requestId = startRegistrationResponse.data.requestId; - let publicKey = { "publicKey": startRegistrationResponse.data.publicKeyCredentialCreationOptions }; - console.log("pubKey: ", publicKey); - - create(publicKey) - .then(makeCredentialResponse => { - console.log("make credential response: " + JSON.stringify(makeCredentialResponse)); - - let uv = getUV(makeCredentialResponse.response.attestationObject); - console.log("uv: " + uv); - - let challengeResponse = { - credential: makeCredentialResponse, - requestId: requestId, - pinSet: startRegistrationResponse.data.pinSet, - pinCode: defaultInvalidPIN, - nickname: nickname - }; - console.log("challengeResponse: ", challengeResponse); - - if(uv === true) { - console.log("finishRegistration: ", challengeResponse); - dispatch(credentialActions.registerFinish(challengeResponse)); - } else { - dispatch(credentialActions.getUV(challengeResponse)); - } - - }) - .catch(error => { - console.error(error); - dispatch(alertActions.error(error.message)); - }); - }) - .catch(error => { - console.error(error); - dispatch(alertActions.error(error.message)); - }); - } - - const inputRef = useRef(null); - - useEffect(() => { - if(show || showAdd) { - inputRef.current.focus(); - } - }, [show, showAdd]); - - if(!supported()) { - return( -
This browser is not compatible with WebAuthn
- ); - } - - return ( - <> -

Security Keys

- {credentials.loading && Loading security keys...} - {credentials.error && ERROR: {credentials.error}} - {credentials.items && - - } -

- -

- - - Edit your security key - - -
- { invalidNickname ? {invalidNickname} : null } -   
-
-
-
-
-
- - - - - -
- - - Add a new security key - - - - { - if (ev.key === 'Enter') { - handleSaveAdd(); - ev.preventDefault(); - } - }}/> - { invalidNickname ? {invalidNickname} : null } -
- -
- - - - -
- - ); - } - - function UV() { - const finishUVRequest = useSelector(state => state.credentials.finishUVRequest); - const svpinChangeeProps = {type: "change", saveCallback: finishUVResponse, showSelector: finishUVRequest}; - const svpinDispatchProps = {type: "dispatch", saveCallback: finishUVResponse, showSelector: finishUVRequest}; - - - function finishUVResponse(fields) { - let challengeResponse = finishUVRequest; - console.log("sending authenticator response with sv-pin: ", challengeResponse); - challengeResponse.pinCode = parseInt(fields.pin); - dispatch(credentialActions.registerFinish(challengeResponse)); - dispatch(credentialActions.completeUV()); - } - - if (finishUVRequest !== undefined && finishUVRequest.pinSet === false) { - return ( - <> - - - ); - } - - return ( - <> - - - ); - - } - - function RecoveryCodes() { - let recoveryCodesViewed = credentials.recoveryCodesViewed; - let allRecoveryCodesUsed = credentials.allRecoveryCodesUsed; - const recoveryCodes = useSelector(state => state.recoveryCodes); - const [showCodes, setShowCodes] = useState(false); - const handleClose = () => { - setShowCodes(false); - } - const handleGenerate = () => { - setShowCodes(true); - dispatch(credentialActions.generateRecoveryCodes()); - } - const handleShow = (e) => { - setShowCodes(true); - dispatch(credentialActions.listRecoveryCodes()); - } - useEffect(() => { - if(recoveryCodesViewed === false || allRecoveryCodesUsed) { - handleShow(); - } - }, [recoveryCodesViewed,allRecoveryCodesUsed]); - - return ( - <> -

Recovery Codes

- -

- - - Recovery Codes - -
- - - If you lose you all your authenticators and don't have the recovery codes you will lose access to your account. - {recoveryCodes.loading && Loading recovery codes...} - {recoveryCodes.generating && Generating recovery codes...} - {recoveryCodes.error && ERROR: {recoveryCodes.error}} - {recoveryCodes.codesRemaining && (recoveryCodes.codesRemaining === 0) ? Please generate new recovery codes now. : ''} - {recoveryCodes.codes && -
    -
  • {recoveryCodes.codes[0]}
  • -
  • {recoveryCodes.codes[1]}
  • -
  • {recoveryCodes.codes[2]}
  • -
  • {recoveryCodes.codes[3]}
  • -
  • {recoveryCodes.codes[4]}
  • -
- } - {recoveryCodes.codes && Save your recovery codes now. They will not be shown again.} - {recoveryCodes.codesRemaining && (recoveryCodes.codesRemaining > 0) ? {recoveryCodes.codesRemaining} recovery codes remaining. : ''} - {allRecoveryCodesUsed && (!recoveryCodes.generating || !recoveryCodes.codes) && All recovery codes have been used. Please generate new recovery codes now.} -

-
Generate new recovery codes
- - -
- - - -
-
- - ); - } - - function DeleteUser() { - const [show, setShow] = useState(false); - const handleClose = () => { - setShow(false); - } - const handleDelete = () => { - setShow(false); - Auth - .currentAuthenticatedUser() - .then((user) => new Promise((resolve, reject) => { - user.deleteUser(error => { - if (error) { - return reject(error); - } - dispatch(userActions.delete(jwt)); - history.push('/login'); - - resolve(); - }); - })) - .catch(error => { - console.error(error); - dispatch(alertActions.error(error.message)); - }); - } - const handleShow = () => { - setShow(true); - } - - return ( - <> -

Delete Account

- -

- - - Delete Account - -
- - - - - - - -
-
- - ); - } - const logout = () => { Auth.signOut(); + navigation.go('LogOutStep'); } + //Review return ( <> -

Hi {userInfo.attributes.name}!

-

Welcome to the WebAuthn Starter Kit!

- - - - - - Logout - +
+

Account Security

+
+
+ +
Trusted Devices
+ + + + + + + + + + + + + + + + + + + +
Safari on macOS. Registered: May 26, 2021
Safari on macOS. Registered: April 26, 2021
Safari on macOS. Registered: March 26, 2021
+
+
+ +
Security Keys
+ + + +
+ +
Server Verified PIN
+ + + + Old PIN         + + + + + + New PIN       + + + + + + Confirm PIN + + + + + +
+ + +
+
+
+
+
Log Out
+
+
+ ); } diff --git a/clients/web/react/src/_components/AccountSecurityStep.js b/clients/web/react/src/_components/AccountSecurityStep.js index b43fec7..43f0612 100644 --- a/clients/web/react/src/_components/AccountSecurityStep.js +++ b/clients/web/react/src/_components/AccountSecurityStep.js @@ -39,7 +39,7 @@ const AccountSecurityStep = ({ setForm, formData, navigation }) => { const dispatch = useDispatch(); useEffect(() => { - setUserData(WebAuthnClient.getCurrentAuthenticatedUser() || undefined); + setUserData(dispatch(userActions.getCurrentAuthenticatedUser()) || undefined); console.log(`Username: ${userData.username}`); console.log(`Token: ${userData.token}`); console.log(`Credential: ${userData.credential}`); diff --git a/clients/web/react/src/_components/Credential/AddCredential.jsx b/clients/web/react/src/_components/Credential/AddCredential.jsx new file mode 100644 index 0000000..4c40b97 --- /dev/null +++ b/clients/web/react/src/_components/Credential/AddCredential.jsx @@ -0,0 +1,194 @@ +import React, { useState, useRef } from 'react'; + +import { credentialActions, alertActions } from '../../_actions'; + +import { create } from '@github/webauthn-json'; +import { Button, Modal, Alert } from 'react-bootstrap'; +import base64url from 'base64url'; +import cbor from 'cbor'; +import axios from 'axios'; +import validate from 'validate.js'; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +function AddCredential() { + const [showAdd, setShowAdd] = useState(false); + const [nickname, setNickname] = useState(''); + const [isResidentKey, setIsResidentKey] = useState(false); + const [invalidNickname, setInvalidNickname] = useState(undefined); + const [submitted, setSubmitted] = useState(false); + const handleClose = () => setShowAdd(false); + const handleShow = () => { + setNickname(''); + setShowAdd(true); + }; + var constraints = { + nickname: { + length: { + maximum: 20, + }, + }, + }; + + const handleSaveAdd = () => { + setSubmitted(true); + + let result = validate({ nickname: nickname }, constraints); + if (result) { + setInvalidNickname(result.nickname.join('. ')); + } else { + setInvalidNickname(undefined); + setShowAdd(false); + register(); + } + }; + + const handleCheckboxChange = (e) => { + const target = e.target; + const value = target.type === 'checkbox' ? target.checked : target.value; + setIsResidentKey(value); + }; + + function getUV(attestationObject) { + let attestationBuffer = base64url.toBuffer(attestationObject); + let attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; + let buffer = attestationStruct.authData; + + let flagsBuf = buffer.slice(32, 33); + let flagsInt = flagsBuf[0]; + let flags = { + up: !!(flagsInt & 0x01), + uv: !!(flagsInt & 0x04), + at: !!(flagsInt & 0x40), + ed: !!(flagsInt & 0x80), + flagsInt, + }; + return flags.uv; + } + + const register = () => { + console.log('register'); + console.log('nickname: ', nickname); + + axios + .post('/users/credentials/fido2/register', { + nickname: nickname, + requireResidentKey: isResidentKey, + }) + .then((startRegistrationResponse) => { + console.log(startRegistrationResponse); + + const requestId = startRegistrationResponse.data.requestId; + + let publicKey = { + publicKey: + startRegistrationResponse.data.publicKeyCredentialCreationOptions, + }; + console.log('publlicKey: ', publicKey); + + create(publicKey) + .then((makeCredentialResponse) => { + console.log( + 'make credential response: ' + + JSON.stringify(makeCredentialResponse) + ); + + let uv = getUV(makeCredentialResponse.response.attestationObject); + console.log('uv: ', uv); + + let challengeResponse = { + credential: makeCredentialResponse, + requestId: requestId, + pinSet: startRegistrationResponse.data.pinSet, + pinCode: defaultInvalidPIN, + nickname: nickname, + }; + + console.log('challengeResponse: ', challengeResponse); + + if (uv === true) { + if (uv === true) { + console.log('finishRegistration: ', challengeResponse); + dispatch(credentialActions.registerFinish(challengeResponse)); + } else { + dispatch(credentialActions.getUV(challengeResponse)); + } + } + }) + .catch((error) => { + console.error(error); + dispatch(alertActions.error(error.message)); + }); + }) + .catch((error) => { + console.error(error); + dispatch(alertActions.error(error.message)); + }); + }; + + const inputRef = useRef(null); + + return ( + <> + + + Add a new security key + + + + { + if (ev.key === 'Enter') { + handleSaveAdd(); + ev.preventDefault(); + } + }} + /> + {invalidNickname ? ( + {invalidNickname} + ) : null} +
+ +
+ + + + +
+ + + ); +} + +export { AddCredential }; diff --git a/clients/web/react/src/_components/Credential/Credential.jsx b/clients/web/react/src/_components/Credential/Credential.jsx new file mode 100644 index 0000000..0b30c1b --- /dev/null +++ b/clients/web/react/src/_components/Credential/Credential.jsx @@ -0,0 +1,36 @@ +import React from 'react'; +import axios from 'axios'; +import aws_exports from '../../aws-exports'; + +import { EditCredential } from './EditCredential' +import { Image } from 'react-bootstrap'; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +function Credential(credential) { + + return ( + <> +
+
+ +
+
+
{credential.credentialNickname.value}
+
YubiKey 5NFC
+

{credential.lastUsedTime}

+
+
+ +
+
+
+ + ); +} + +export { Credential }; diff --git a/clients/web/react/src/_components/Credential/CredentialList.jsx b/clients/web/react/src/_components/Credential/CredentialList.jsx new file mode 100644 index 0000000..ecca300 --- /dev/null +++ b/clients/web/react/src/_components/Credential/CredentialList.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import axios from 'axios'; +import aws_exports from '../../aws-exports'; + +import { AddCredential } from './AddCredential' +import { Credential } from './Credential' +import { Card } from 'react-bootstrap'; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +function CredentialList({credentials}) { + return ( + +
Security Keys
+ + {credentials.map((credential, index) => + + )} + + +
+ ); +} + +export { CredentialList }; diff --git a/clients/web/react/src/_components/Credential/EditCredential.jsx b/clients/web/react/src/_components/Credential/EditCredential.jsx new file mode 100644 index 0000000..742edc3 --- /dev/null +++ b/clients/web/react/src/_components/Credential/EditCredential.jsx @@ -0,0 +1,160 @@ +import React, { useState, useRef } from 'react'; + +import { credentialActions } from '../../_actions'; + +import { Button, Modal, Alert } from 'react-bootstrap'; +import axios from 'axios'; +import validate from 'validate.js'; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +function EditCredential(credential) { + const [show, setShow] = useState(false); + const [nickname, setNickname] = useState(''); + const [invalidNickname, setInvalidNickname] = useState(undefined); + const [submitted, setSubmitted] = useState(false); + const handleClose = () => setShowAdd(false); + const handleShow = () => { + setNickname(credential.credentialNickname.value); + setCredential(credential); + setAttestationMetadata(credential.attestationMetadata.value); + setShow(true); + }; + const handleDelete = () => { + setShow(false); + dispatch( + credentialActions.delete(credential.credential.credentialId.base64) + ); + }; + var constraints = { + nickname: { + length: { + maximum: 20, + }, + }, + }; + + const handleSave = () => { + setSubmitted(true); + let result = validate({ nickname: nickname }, constraints); + if (result) { + setInvalidNickname(result.nickname.join('. ')); + return result; + } else { + setInvalidNickname(undefined); + } + + setShow(false); + credential.credentialNickname.value = nickname; + dispatch(credentialActions.update(credential)); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setNickname(value); + }; + const inputRef = useRef(null); + + return ( + <> + + + + Edit your security key + + + +
+ {invalidNickname ? ( + {invalidNickname} + ) : null} + +    + +
+ +
+ +
+ +
+ +
+
+ + + + + +
+ + ); +} + +export { EditCredential }; diff --git a/clients/web/react/src/_components/Credential/index.js b/clients/web/react/src/_components/Credential/index.js new file mode 100644 index 0000000..30fb19d --- /dev/null +++ b/clients/web/react/src/_components/Credential/index.js @@ -0,0 +1 @@ +export * from './CredentialList' \ No newline at end of file diff --git a/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx b/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx new file mode 100644 index 0000000..8891844 --- /dev/null +++ b/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx @@ -0,0 +1,64 @@ +import React from 'react'; +import axios from 'axios'; +import aws_exports from '../../aws-exports'; +import { userActions, alertActions } from '../_actions'; + +import { Button, Card, Modal } from 'react-bootstrap'; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +function DeleteUser({ userToken, navigation }) { + const [show, setShow] = useState(false); + const handleShow = () => { + setShow(true); + } + const handleClose = () => { + setShow(false); + } + + const handleDelete = () => { + setShow(false); + Auth.currentAuthenticatedUser().then((user) => new Promise((resolve, reject) => { + user.deleteUser(error => { + if(error) { + return reject(error); + } + dispatch(userActions.delete(userToken)); + navigation.go('LogOutStep'); + + resolve(); + }); + })) + .catch(error => { + console.error(error); + dispatch(alertActions.error(error.message)); + }); + } + + return ( + <> + +
Delete Account
+ + + +
+ + + Delete Account + + + + + + + + + + + ); +} + +export { DeleteUser }; diff --git a/clients/web/react/src/_components/DeleteUser/index.js b/clients/web/react/src/_components/DeleteUser/index.js new file mode 100644 index 0000000..edbc0d8 --- /dev/null +++ b/clients/web/react/src/_components/DeleteUser/index.js @@ -0,0 +1 @@ +export * from './DeleteUser' \ No newline at end of file diff --git a/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx b/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx new file mode 100644 index 0000000..0a74d58 --- /dev/null +++ b/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx @@ -0,0 +1,117 @@ +import React from 'react'; +import axios from 'axios'; +import aws_exports from '../../aws-exports'; + +import { useSelector } from 'react-redux'; +import { Alert, Button, Card, Modal } from 'react-bootstrap'; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +function RecoveryCodes({ credentials }) { + let recoveryCodesViewed = credentials.recoveryCodesViewed; + let allRecoveryCodesUsed = credentials.allRecoveryCodesUsed; + const recoveryCodes = useSelector((state) => state.recoveryCodes); + + const [showCodes, setShowCodes] = useState(false); + + const handleClose = () => { + setShowCodes(false); + }; + const handleShow = () => { + setShowCodes(true); + dispatch(credentialActions.recoveryCodesViewed()); + }; + const handleGenerate = () => { + setShowCodes(true); + dispatch(credentialActions.generateRecoveryCodes()); + }; + + useEffect(() => { + if (recoveryCodesViewed === false || allRecoveryCodesUsed) { + handleShow(); + } + }, [recoveryCodesViewed, allRecoveryCodesUsed]); + + return ( + <> + + +
Recovery Options
+
+ + + +
+ + + Recovery Codes + + + + + If you lose you all your authenticators and don't have the recovery + codes you will lose access to your account. + + {recoveryCodes.loading && Loading recovery codes...} + {recoveryCodes.generating && Generating recovery codes...} + {recoveryCodes.error && ( + ERROR: {recoveryCodes.error} + )} + {recoveryCodes.codesRemaining && + recoveryCodes.codesRemaining === 0 ? ( + Please generate new recovery codes now. + ) : ( + '' + )} + {recoveryCodes.codes && ( +
    +
  • {recoveryCodes.codes[0]}
  • +
  • {recoveryCodes.codes[1]}
  • +
  • {recoveryCodes.codes[2]}
  • +
  • {recoveryCodes.codes[3]}
  • +
  • {recoveryCodes.codes[4]}
  • +
+ )} + {recoveryCodes.codes && ( + + Save your recovery codes now. They will not be shown again. + + )} + {recoveryCodes.codesRemaining && recoveryCodes.codesRemaining > 0 ? ( + {recoveryCodes.codesRemaining} recovery codes remaining. + ) : ( + '' + )} + {allRecoveryCodesUsed && + (!recoveryCodes.generating || !recoveryCodes.codes) && ( + + All recovery codes have been used. Please generate new recovery + codes now. + + )} +

+
Generate new recovery codes
+ + +
+ + + +
+ + ); +} + +export { RecoveryCodes }; diff --git a/clients/web/react/src/_components/RecoveryCodes/index.js b/clients/web/react/src/_components/RecoveryCodes/index.js new file mode 100644 index 0000000..ce7b0c2 --- /dev/null +++ b/clients/web/react/src/_components/RecoveryCodes/index.js @@ -0,0 +1 @@ +export * from './RecoveryCodes' \ No newline at end of file From 8834d707df93e42f9dadcc4a86b84232ccdf6567 Mon Sep 17 00:00:00 2001 From: Luke Walker Date: Mon, 22 Nov 2021 16:18:23 -0800 Subject: [PATCH 20/66] cleanup signup --- clients/web/react/src/HomePage/HomePage.jsx | 4 +++- clients/web/react/src/RegisterPage/SignUpStep.js | 2 +- clients/web/react/src/_components/WebAuthnClient.js | 13 ------------- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 2d9c94b..4995448 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -452,6 +452,8 @@ function HomePage() { const logout = () => { Auth.signOut(); + history.push("/login"); + history.go(); } return ( @@ -463,7 +465,7 @@ function HomePage() { - Logout + ); } diff --git a/clients/web/react/src/RegisterPage/SignUpStep.js b/clients/web/react/src/RegisterPage/SignUpStep.js index 9c69612..33cd872 100644 --- a/clients/web/react/src/RegisterPage/SignUpStep.js +++ b/clients/web/react/src/RegisterPage/SignUpStep.js @@ -70,7 +70,7 @@ const SignUpStep = ({ setForm, formData, navigation }) => { const registerKeySuccessStep = (credential) => { localStorage.setItem('credential', JSON.stringify(credential)); console.log('registerKeySuccessStep credential ', credential); - history.push('/register'); + window.location.reload(); } const handleChange = (e) => { diff --git a/clients/web/react/src/_components/WebAuthnClient.js b/clients/web/react/src/_components/WebAuthnClient.js index 89a0442..0d68d4a 100644 --- a/clients/web/react/src/_components/WebAuthnClient.js +++ b/clients/web/react/src/_components/WebAuthnClient.js @@ -223,23 +223,10 @@ async function sendChallengeAnswer(cognitoUser, challengeResponse, pin = default let user = await Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)); console.log("WebAuthnClient sendChallengeAnswer user: ", user); - let currentUser = await Auth.currentAuthenticatedUser({ - bypassCache: true // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data - }); - console.log("WebAuthnClient sendChallengeAnswer() currentAuthenticatedUser", currentUser); - - //let userSession = await Auth.userSession(user); - //console.log("WebAuthnClient sendChallengeAnswer() userSession", userSession); - window.location.reload(); - - - let data = await Auth.currentSession(); - console.log("WebAuthnClient sendChallengeAnswer data: ", data); userData = { id: 1, username: user.username, credential: challengeResponse.credential, - token: data.getAccessToken().getJwtToken() } localStorage.setItem('user', JSON.stringify(userData)); console.log("WebAuthnClient sendChallengeAnswer userData: ", localStorage.getItem('user')); From 7ae8a2e8213c3411a231c59ca41d97695fbab9ee Mon Sep 17 00:00:00 2001 From: csalas Date: Tue, 23 Nov 2021 14:41:04 -0700 Subject: [PATCH 21/66] Added Linter with AirBnb configurations, changes for Readme made to add live changes in VS Code --- clients/web/react/.eslintrc.json | 21 + clients/web/react/README.md | 22 +- clients/web/react/package-lock.json | 25261 +++++++++++++++----------- clients/web/react/package.json | 11 + 4 files changed, 14460 insertions(+), 10855 deletions(-) create mode 100644 clients/web/react/.eslintrc.json diff --git a/clients/web/react/.eslintrc.json b/clients/web/react/.eslintrc.json new file mode 100644 index 0000000..f9da2ff --- /dev/null +++ b/clients/web/react/.eslintrc.json @@ -0,0 +1,21 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ "airbnb", "plugin:prettier/recommended" ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 13, + "sourceType": "module" + }, + "plugins": [ + "react", + "@typescript-eslint" + ], + "rules": { + } +} diff --git a/clients/web/react/README.md b/clients/web/react/README.md index b4902ba..6d11a58 100755 --- a/clients/web/react/README.md +++ b/clients/web/react/README.md @@ -8,7 +8,27 @@ 1. Install npm packages. Run `npm install` 1. Start the web app. Run `npm start` +## Configuring Linter + +The .eslintrc file should already be in this project. In order to get live changes follow these steps: + +1. Install the esLint VS Code Extension +2. Download the Prettier VS Code Extension +3. In VS Code go to File -> Preferences -> Settings and add the following lines + +```json + "[javascript]": { + "editor.formatOnSave": false + } + "editor.tabSize": 2, + "eslint.alwaysShowStatus": true, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + } +``` ## Credits + Thanks to [https://github.com/cornflourblue](https://github.com/cornflourblue) for the -[React Hooks + Redux - User Registration and Login Example](https://github.com/cornflourblue/react-hooks-redux-registration-login-example) \ No newline at end of file +[React Hooks + Redux - User Registration and Login Example](https://github.com/cornflourblue/react-hooks-redux-registration-login-example) diff --git a/clients/web/react/package-lock.json b/clients/web/react/package-lock.json index 83f382c..838ddc6 100644 --- a/clients/web/react/package-lock.json +++ b/clients/web/react/package-lock.json @@ -33,10 +33,21 @@ "@babel/preset-env": "^7.12.1", "@babel/preset-react": "^7.12.1", "@babel/runtime": "^7.12.1", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", "babel-loader": "^8.1.0", "css-loader": "^5.2.4", + "eslint": "^8.3.0", + "eslint-config-airbnb": "^19.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", "html-webpack-plugin": "^3.2.0", "path": "^0.12.7", + "prettier": "^2.4.1", "style-loader": "^2.0.0", "webpack": "^4.44.2", "webpack-cli": "^3.3.12", @@ -3552,11 +3563,27 @@ } }, "node_modules/@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz", + "integrity": "sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==", + "dev": true, "dependencies": { + "core-js-pure": "^3.19.0", "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/template": { @@ -3610,6 +3637,96 @@ "node": ">=0.1.95" } }, + "node_modules/@eslint/eslintrc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@github/webauthn-json": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-0.4.5.tgz", @@ -3633,6 +3750,26 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jest/create-cache-key-function": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-26.6.2.tgz", @@ -3731,6 +3868,41 @@ "node": ">=8" } }, + "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/@popperjs/core": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", @@ -4284,9 +4456,15 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "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/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "node_modules/@types/minimatch": { @@ -4359,125 +4537,408 @@ "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "peer": true }, - "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", + "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@typescript-eslint/experimental-utils": "5.4.0", + "@typescript-eslint/scope-manager": "5.4.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true, + "engines": { + "node": ">= 4" + } }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "node_modules/@typescript-eslint/eslint-plugin/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": { - "@webassemblyjs/ast": "1.9.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", + "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/typescript-estree": "5.4.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "node_modules/@typescript-eslint/experimental-utils/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": { - "@xtuc/ieee754": "^1.2.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "node_modules/@typescript-eslint/parser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", + "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", "dev": true, "dependencies": { - "@xtuc/long": "4.2.2" + "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/typescript-estree": "5.4.0", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", + "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/visitor-keys": "5.4.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "node_modules/@typescript-eslint/types": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", + "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", + "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/visitor-keys": "5.4.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", + "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.4.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/ieee754": "1.9.0", "@webassemblyjs/leb128": "1.9.0", "@webassemblyjs/utf8": "1.9.0" @@ -4588,6 +5049,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4746,6 +5216,19 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -4787,6 +5270,25 @@ "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=" }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", @@ -4828,6 +5330,40 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -4897,6 +5433,12 @@ "node": ">=4" } }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, "node_modules/ast-types/node_modules/tslib": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", @@ -4961,6 +5503,15 @@ "@aws-amplify/xr": "2.2.30" } }, + "node_modules/axe-core": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", + "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/axios": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", @@ -4970,6 +5521,12 @@ "follow-redirects": "^1.10.0" } }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, "node_modules/babel-core": { "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", @@ -6109,6 +6666,12 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -6246,7 +6809,18 @@ "semver": "bin/semver.js" } }, - "node_modules/core-util-is": { + "node_modules/core-js-pure": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz", + "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" @@ -6512,6 +7086,12 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "node_modules/damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", + "dev": true + }, "node_modules/dayjs": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", @@ -6519,9 +7099,9 @@ "peer": true }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { "ms": "2.1.2" }, @@ -6572,6 +7152,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/deepmerge": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", @@ -6713,6 +7299,18 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "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", @@ -6738,6 +7336,18 @@ "buffer-indexof": "^1.0.0" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -6962,6 +7572,27 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/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/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -7027,27 +7658,31 @@ } }, "node_modules/es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "unbox-primitive": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7094,1936 +7729,1941 @@ "node": ">=0.8.0" } }, - "node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "node_modules/eslint": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", + "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "@eslint/eslintrc": "^1.0.4", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.1.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, - "engines": { - "node": ">=4.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==", - "peer": true, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/eslint-config-airbnb": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.1.tgz", + "integrity": "sha512-ooV8Vdt3gmV6hCSJutRw5beArd56Cd++vvy7j0Y7DBhUKqcTyI7cWNcJpCJlcftGPRLtzdU0hNMtquOUSSm8nA==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" }, "engines": { - "node": ">=4.0" + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, "engines": { - "node": ">=4.0" + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", "dev": true, - "engines": { - "node": ">=4.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "peer": true, + "node_modules/eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "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/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, "engines": { - "node": ">=0.8.x" + "node": ">=4" } }, - "node_modules/eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "dependencies": { - "original": "^1.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=0.12.0" + "node": ">=4" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "peer": true + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/execa": { + "node_modules/eslint-module-utils/node_modules/p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "find-up": "^2.1.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "node_modules/eslint-plugin-import": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", + "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", + "dev": true, "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.1", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/expand-brackets/node_modules/debug": { + "node_modules/eslint-plugin-import/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/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/eslint-plugin-import/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/eslint-plugin-jsx-a11y": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", + "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", + "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "@babel/runtime": "^7.16.3", + "aria-query": "^4.2.2", + "array-includes": "^3.1.4", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.3.5", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "prettier-linter-helpers": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/eslint-plugin-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", + "integrity": "sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", + "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/eslint-plugin-react/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/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "node_modules/eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "node_modules/eslint/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, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "node_modules/eslint/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": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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=", + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/express/node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "node_modules/eslint/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": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", + "node_modules/eslint/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": { - "ms": "2.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.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/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=", + "node_modules/eslint/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/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/eslint/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": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/eslint/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/eslint/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-extendable": "^0.1.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/eslint/node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-base64-decode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", - "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" - }, - "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-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/eslint/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/fast-xml-parser": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", - "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", - "bin": { - "xml2js": "cli.js" + "node_modules/eslint/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": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "websocket-driver": ">=0.5.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=0.8.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "peer": true, + "node_modules/eslint/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "bser": "2.1.1" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "node_modules/eslint/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, - "optional": true + "engines": { + "node": ">=8" + } }, - "node_modules/fill-range": { + "node_modules/eslint/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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/eslint/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": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/eslint/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": { - "is-extendable": "^0.1.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/fill-range/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/eslint/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": ">=0.10.0" + "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/eslint/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": { - "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" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "node_modules/eslint/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": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/eslint/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": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "node_modules/eslint/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/espree": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", + "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", "dev": true, "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "acorn": "^8.6.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" }, "engines": { - "node": ">= 0.10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/flow-parser": { - "version": "0.121.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", - "integrity": "sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==", - "peer": true, + "node_modules/espree/node_modules/acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { "node": ">=0.4.0" } }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "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==", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/flush-write-stream/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==", + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "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" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/flush-write-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/esquery/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, - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=4.0" } }, - "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==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "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" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "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": ">= 0.6" + "node": ">=4.0" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dependencies": { - "map-cache": "^0.2.2" - }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "engines": { "node": ">= 0.6" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/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/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "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/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=6 <7 || >=8" + "node": ">=0.8.x" } }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" } }, - "node_modules/fs-write-stream-atomic/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==", + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "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" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "peer": true }, - "node_modules/fs.realpath": { + "node_modules/execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=6" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "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==", + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "is-descriptor": "^0.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "pump": "^3.0.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "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" + "is-buffer": "^1.1.5" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "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, - "optional": true, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dependencies": { - "is-glob": "^4.0.1" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "global-prefix": "^3.0.0" + "is-buffer": "^1.1.5" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "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==", + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "node_modules/graphql": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.0.tgz", - "integrity": "sha512-HGVcnO6B25YZcSt6ZsH6/N+XkYuPA7yMqJmlJ4JWxWlS4Tr8SHI56R1Ocs8Eor7V7joEZPRXPDH8RRdll1w44Q==", + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, "dependencies": { - "iterall": "^1.2.2" + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": "6.x || 8.x || >= 10.x" + "node": ">= 0.10.0" } }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "node_modules/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/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, + "node_modules/express/node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.6" } }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "ms": "2.0.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=", - "engines": { - "node": ">=4" - } + "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/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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/express/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/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dependencies": { - "is-buffer": "^1.1.5" + "is-descriptor": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/hash-base/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/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } + "node_modules/fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" }, - "node_modules/hermes-engine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.7.2.tgz", - "integrity": "sha512-E2DkRaO97gwL98LPhgfkMqhHiNsrAjIfEk3wWYn2Y31xdkdWn0572H7RnVcGujMJVqZNJvtknxlpsUb8Wzc3KA==", - "peer": true + "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/hermes-profile-transformer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", - "peer": true, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, "dependencies": { - "source-map": "^0.7.3" + "@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" } }, - "node_modules/hermes-profile-transformer/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==", - "peer": true, + "node_modules/fast-glob/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": ">=8" } }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "node_modules/fast-glob/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": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "node_modules/fast-glob/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, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "engines": { + "node": ">=0.12.0" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "node_modules/fast-glob/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": { - "react-is": "^16.7.0" + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "node_modules/fast-glob/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": { - "parse-passwd": "^1.0.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, - "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=", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", + "bin": { + "xml2js": "cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "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": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "reusify": "^1.0.4" } }, - "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==", + "node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "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" + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" } }, - "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, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "peer": true, "dependencies": { - "safe-buffer": "~5.1.0" + "bser": "2.1.1" } }, - "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "node_modules/html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "bin": { - "html-minifier": "cli.js" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "deprecated": "3.x is no longer supported", + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true, - "dependencies": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + "node": ">=0.10.0" } }, - "node_modules/html-webpack-plugin/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/html-webpack-plugin/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true, + "node_modules/fill-range/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { - "node": ">= 0.10" - } - }, - "node_modules/html-webpack-plugin/node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true, - "bin": { - "json5": "lib/cli.js" + "node": ">=0.10.0" } }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "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/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "ms": "2.0.0" } }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "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/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", - "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, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "dependencies": { - "http-proxy": "^1.17.0", + "detect-file": "^1.0.0", "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" }, "engines": { - "node": ">=4.0.0" + "node": ">= 0.10" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "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==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.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==", + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" + "dependencies": { + "glob": "^7.1.3" }, - "peerDependencies": { - "postcss": "^8.1.0" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/idb": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/idb/-/idb-5.0.6.tgz", - "integrity": "sha512-/PFvOWPzRcEPmlDt5jEvzVZVs0wyd/EvGvkDIcbBpGuMMLQKrTPG0TxvE2UJtgZtCQCmOtM2QD7yQJBVEjKGOw==" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "node_modules/flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, - "node_modules/image-size": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", - "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==", + "node_modules/flow-parser": { + "version": "0.121.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", + "integrity": "sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==", "peer": true, - "bin": { - "image-size": "bin/image-size.js" - }, "engines": { - "node": ">=4.0" - } - }, - "node_modules/immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" + "node": ">=0.4.0" } }, - "node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "peer": true, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, - "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "node_modules/flush-write-stream/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": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" + "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/import-local/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" + "safe-buffer": "~5.1.0" } }, - "node_modules/import-local/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">=6" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/import-local/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/import-local/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dependencies": { - "find-up": "^3.0.0" + "map-cache": "^0.2.2" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "engines": { - "node": ">=0.8.19" + "node": ">= 0.6" } }, - "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=", + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "node_modules/from2/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": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" + "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/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "peer": true, "dependencies": { - "loose-envify": "^1.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, - "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==", + "node_modules/fs-write-stream-atomic/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, - "engines": { - "node": ">= 0.10" + "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/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/is-accessor-descriptor": { + "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "peer": true + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/is-bigint": { + "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "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, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true, - "engines": { - "node": ">= 0.4" + "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==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "peer": true, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dependencies": { - "ci-info": "^2.0.0" + "pump": "^3.0.0" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">=6" } }, - "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, "dependencies": { - "has": "^1.0.3" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "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-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, "dependencies": { - "is-plain-object": "^2.0.4" + "global-prefix": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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=", + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { "node": ">=4" } }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "node_modules/globby/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.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/graphql": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.0.tgz", + "integrity": "sha512-HGVcnO6B25YZcSt6ZsH6/N+XkYuPA7yMqJmlJ4JWxWlS4Tr8SHI56R1Ocs8Eor7V7joEZPRXPDH8RRdll1w44Q==", "dependencies": { - "kind-of": "^3.0.2" + "iterall": "^1.2.2" }, "engines": { - "node": ">=0.10.0" + "node": "6.x || 8.x || >= 10.x" } }, - "node_modules/is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true }, - "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==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { - "isobject": "^3.0.1" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4.0" } }, - "node_modules/is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true, + "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==", "engines": { "node": ">= 0.4" }, @@ -9031,13 +9671,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "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.1" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9046,1210 +9686,1204 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/isomorphic-unfetch": { + "node_modules/hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/iterall": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + "node_modules/hash-base/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/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "peer": true, - "engines": { - "node": ">= 10.14.2" + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "peer": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" } }, - "node_modules/jest-haste-map/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/hermes-engine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.7.2.tgz", + "integrity": "sha512-E2DkRaO97gwL98LPhgfkMqhHiNsrAjIfEk3wWYn2Y31xdkdWn0572H7RnVcGujMJVqZNJvtknxlpsUb8Wzc3KA==", + "peer": true + }, + "node_modules/hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", "peer": true, "dependencies": { - "fill-range": "^7.0.1" + "source-map": "^0.7.3" }, "engines": { "node": ">=8" } }, - "node_modules/jest-haste-map/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==", - "peer": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-haste-map/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==", + "node_modules/hermes-profile-transformer/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==", "peer": true, "engines": { - "node": ">=0.12.0" + "node": ">= 8" } }, - "node_modules/jest-haste-map/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "peer": true, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" } }, - "node_modules/jest-haste-map/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==", - "peer": true, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "peer": true, - "engines": { - "node": ">= 10.14.2" + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" } }, - "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "peer": true, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" + "parse-passwd": "^1.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=0.10.0" } }, - "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "peer": true, + "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": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">= 10.14.2" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/jest-util/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==", - "peer": true, + "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": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "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/jest-util/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "peer": true, + "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": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.1.0" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "peer": true, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" }, - "engines": { - "node": ">=10" + "bin": { + "html-minifier": "cli.js" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/jest-util/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==", - "peer": true, + "node_modules/html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "deprecated": "3.x is no longer supported", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" } }, - "node_modules/jest-util/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==", - "peer": true - }, - "node_modules/jest-util/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==", - "peer": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "node_modules/html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/jest-util/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==", - "peer": true, + "node_modules/html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/jest-util/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==", - "peer": true, - "engines": { - "node": ">=0.12.0" + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/jest-util/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "peer": true, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } }, - "node_modules/jest-util/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==", - "peer": true, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" } }, - "node_modules/jest-util/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==", - "peer": true, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "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.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dependencies": { - "is-number": "^7.0.0" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" }, "engines": { - "node": ">=8.0" + "node": ">= 0.6" } }, - "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "peer": true, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "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": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=8.0.0" } }, - "node_modules/jest-validate/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==", - "peer": true, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4.0.0" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "peer": true, + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/jest-validate/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==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "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": ">=7.0.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/jest-validate/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==", - "peer": true + "node_modules/idb": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/idb/-/idb-5.0.6.tgz", + "integrity": "sha512-/PFvOWPzRcEPmlDt5jEvzVZVs0wyd/EvGvkDIcbBpGuMMLQKrTPG0TxvE2UJtgZtCQCmOtM2QD7yQJBVEjKGOw==" }, - "node_modules/jest-validate/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==", - "peer": true, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/jest-validate/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==", + "node_modules/image-size": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", + "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==", "peer": true, - "dependencies": { - "has-flag": "^4.0.0" + "bin": { + "image-size": "bin/image-size.js" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "peer": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=4" } }, - "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==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/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==", - "peer": true, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jetifier": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", - "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==", - "peer": true, "bin": { - "jetifier": "bin/jetify", - "jetifier-standalone": "bin/jetifier-standalone", - "jetify": "bin/jetify" + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/joi": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz", - "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==", - "peer": true, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "peer": true - }, - "node_modules/js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "peer": true, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6" } }, - "node_modules/jsc-android": { - "version": "245459.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", - "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==", - "peer": true - }, - "node_modules/jscodeshift": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.11.0.tgz", - "integrity": "sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g==", - "peer": true, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "dependencies": { - "@babel/core": "^7.1.6", - "@babel/parser": "^7.1.6", - "@babel/plugin-proposal-class-properties": "^7.1.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.1.0", - "@babel/plugin-proposal-optional-chaining": "^7.1.0", - "@babel/plugin-transform-modules-commonjs": "^7.1.0", - "@babel/preset-flow": "^7.0.0", - "@babel/preset-typescript": "^7.1.0", - "@babel/register": "^7.0.0", - "babel-core": "^7.0.0-bridge.0", - "colors": "^1.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^3.1.10", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.20.3", - "temp": "^0.8.1", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" + "p-limit": "^2.0.0" }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" + "engines": { + "node": ">=6" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, + "node_modules/import-local/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, "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==" - }, - "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/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "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==", + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" + "find-up": "^3.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" } }, - "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "peer": true - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" - }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "node_modules/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/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "peer": true, - "engines": { - "node": ">=6" - } + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "peer": true, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, "engines": { "node": ">=6" } }, - "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "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==", + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=4.0.0" + "node": ">= 0.4" } }, - "node_modules/loader-utils/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/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" } }, - "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==", + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "loose-envify": "^1.0.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "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=" - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", - "peer": true + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "peer": true, - "dependencies": { - "chalk": "^2.0.1" - }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "peer": true, - "dependencies": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "bin": { - "logkitty": "bin/logkitty.js" + "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/logkitty/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "peer": true, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/logkitty/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==", - "peer": true, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dependencies": { - "color-convert": "^2.0.1" + "kind-of": "^6.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/logkitty/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "node": ">=0.10.0" } }, - "node_modules/logkitty/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==", - "peer": true, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "call-bind": "^1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/logkitty/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==", - "peer": true - }, - "node_modules/logkitty/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "peer": true }, - "node_modules/logkitty/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "peer": true, - "engines": { - "node": ">=8" + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/logkitty/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "peer": 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, + "optional": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/logkitty/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "peer": true, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.0" + "call-bind": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/logkitty/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ci-info": "^2.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "is-ci": "bin.js" } }, - "node_modules/logkitty/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "peer": true, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "has": "^1.0.3" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/logkitty/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "peer": true, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "kind-of": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">= 0.4" }, "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dependencies": { - "yallist": "^3.0.2" + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "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==", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "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": { - "semver": "^6.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "peer": true, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dependencies": { - "tmpl": "1.0.x" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "object-visit": "^1.0.0" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "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, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "engines": { + "node": ">=6" } }, - "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=", + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" } }, - "node_modules/memory-fs/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, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dependencies": { - "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" + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "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": { - "safe-buffer": "~5.1.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/merge-descriptors": { + "node_modules/is-shared-array-buffer": { "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==", - "peer": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", "dev": true, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/metro": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.64.0.tgz", - "integrity": "sha512-G2OC08Rzfs0kqnSEuKo2yZxR+/eNUpA93Ru45c60uN0Dw3HPrDi+ZBipgFftC6iLE0l+6hu8roFFIofotWxybw==", - "peer": true, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "absolute-path": "^0.0.0", - "accepts": "^1.3.7", - "async": "^2.4.0", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "fs-extra": "^1.0.0", - "graceful-fs": "^4.1.3", - "image-size": "^0.6.0", - "invariant": "^2.2.4", - "jest-haste-map": "^26.5.2", - "jest-worker": "^26.0.0", - "lodash.throttle": "^4.1.1", - "metro-babel-register": "0.64.0", - "metro-babel-transformer": "0.64.0", - "metro-cache": "0.64.0", - "metro-cache-key": "0.64.0", - "metro-config": "0.64.0", - "metro-core": "0.64.0", - "metro-hermes-compiler": "0.64.0", - "metro-inspector-proxy": "0.64.0", - "metro-minify-uglify": "0.64.0", - "metro-react-native-babel-preset": "0.64.0", - "metro-resolver": "0.64.0", - "metro-runtime": "0.64.0", - "metro-source-map": "0.64.0", - "metro-symbolicate": "0.64.0", - "metro-transform-plugins": "0.64.0", - "metro-transform-worker": "0.64.0", - "mime-types": "^2.1.27", - "mkdirp": "^0.5.1", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "rimraf": "^2.5.4", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "temp": "0.8.3", - "throat": "^5.0.0", - "ws": "^1.1.5", - "yargs": "^15.3.1" + "has-tostringtag": "^1.0.0" }, - "bin": { - "metro": "src/cli.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/metro-babel-register": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.64.0.tgz", - "integrity": "sha512-Kf6YvE3kIRumGnjK0Q9LqGDIdnsX9eFGtNBmBuCVDuB9wGGA/5CgX8We8W7Y44dz1RGTcHJRhfw5iGg+pwC3aQ==", - "peer": true, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, "dependencies": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/register": "^7.0.0", - "escape-string-regexp": "^1.0.5" + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/metro-babel-transformer": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.64.0.tgz", - "integrity": "sha512-itZaxKTgmKGEZWxNzbSZBc22NngrMZzoUNuU92aHSTGkYi2WH4XlvzEHsstmIKHMsRVKl75cA+mNmgk4gBFJKw==", - "peer": true, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, "dependencies": { - "@babel/core": "^7.0.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1" + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/metro-cache": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.64.0.tgz", - "integrity": "sha512-QvGfxe/1QQYM9XOlR8W1xqE9eHDw/AgJIgYGn/TxZxBu9Zga+Rgs1omeSZju45D8w5VWgMr83ma5kACgzvOecg==", - "peer": true, - "dependencies": { - "metro-core": "0.64.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4" + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/metro-cache-key": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.64.0.tgz", - "integrity": "sha512-O9B65G8L/fopck45ZhdRosyVZdMtUQuX5mBWEC1NRj02iWBIUPLmYMjrunqIe8vHipCMp3DtTCm/65IlBmO8jg==", - "peer": true + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } }, - "node_modules/metro-config": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.64.0.tgz", - "integrity": "sha512-QhM4asnX5KhlRWaugwVGNNXhX0Z85u5nK0UQ/A90bBb4xWyXqUe20e788VtdA75rkQiiI6wXTCIHWT0afbnjwQ==", - "peer": true, - "dependencies": { - "cosmiconfig": "^5.0.5", - "jest-validate": "^26.5.2", - "metro": "0.64.0", - "metro-cache": "0.64.0", - "metro-core": "0.64.0", - "metro-runtime": "0.64.0" + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/metro-core": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.64.0.tgz", - "integrity": "sha512-v8ZQ5j72EaUwamQ8pLfHlOHTyp7SbdazvHPzFGDpHnwIQqIT0Bw3Syg8R4regTlVG3ngpeSEAi005UITljmMcQ==", - "peer": true, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", "dependencies": { - "jest-haste-map": "^26.5.2", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.64.0" + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" } }, - "node_modules/metro-hermes-compiler": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.64.0.tgz", - "integrity": "sha512-CLAjVDWGAoGhbi2ZyPHnH5YDdfrDIx6+tzFWfHGIMTZkYBXsYta9IfYXBV8lFb6BIbrXLjlXZAOoosknetMPOA==", - "peer": true + "node_modules/iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" }, - "node_modules/metro-inspector-proxy": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.64.0.tgz", - "integrity": "sha512-KywbH3GNSz9Iqw4UH3smgaV2dBHHYMISeN7ORntDL/G+xfgPc6vt13d+zFb907YpUcXj5N0vdoiAHI5V/0y8IA==", + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "peer": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "peer": true, "dependencies": { - "connect": "^3.6.5", - "debug": "^2.2.0", - "ws": "^1.1.5", - "yargs": "^15.3.1" + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" }, - "bin": { - "metro-inspector-proxy": "src/cli.js" + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" } }, - "node_modules/metro-inspector-proxy/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "node_modules/jest-haste-map/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "peer": true, + "dependencies": { + "fill-range": "^7.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/metro-inspector-proxy/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==", + "node_modules/jest-haste-map/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==", "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/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==", + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-haste-map/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "peer": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-haste-map/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==", + "peer": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "peer": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "peer": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "peer": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util/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==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" @@ -10258,18 +10892,35 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/metro-inspector-proxy/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "node_modules/jest-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "peer": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/metro-inspector-proxy/node_modules/color-convert": { + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "peer": 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/jest-util/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==", @@ -10281,313 +10932,124 @@ "node": ">=7.0.0" } }, - "node_modules/metro-inspector-proxy/node_modules/color-name": { + "node_modules/jest-util/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==", "peer": true }, - "node_modules/metro-inspector-proxy/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/jest-util/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==", "peer": true, "dependencies": { - "ms": "2.0.0" + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/metro-inspector-proxy/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==", - "peer": true - }, - "node_modules/metro-inspector-proxy/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==", + "node_modules/jest-util/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==", "peer": true, "engines": { "node": ">=8" } }, - "node_modules/metro-inspector-proxy/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "peer": true - }, - "node_modules/metro-inspector-proxy/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "node_modules/jest-util/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==", "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, - "node_modules/metro-inspector-proxy/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "node_modules/jest-util/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "peer": true, "dependencies": { - "ansi-regex": "^5.0.0" + "braces": "^3.0.1", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/metro-inspector-proxy/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/jest-util/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==", "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/metro-inspector-proxy/node_modules/ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "node_modules/jest-util/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==", "peer": true, "dependencies": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "node_modules/metro-inspector-proxy/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "peer": true, "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" }, "engines": { - "node": ">=8" + "node": ">= 10.14.2" } }, - "node_modules/metro-inspector-proxy/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/jest-validate/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==", "peer": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/metro-minify-uglify": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.64.0.tgz", - "integrity": "sha512-DRwRstqXR5qfte9Nuwoov5dRXxL7fJeVlO5fGyOajWeO3+AgPjvjXh/UcLJqftkMWTPGUFuzAD5/7JC5v5FLWw==", - "peer": true, - "dependencies": { - "uglify-es": "^3.1.9" - } - }, - "node_modules/metro-react-native-babel-preset": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", - "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "react-refresh": "^0.4.0" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/metro-react-native-babel-transformer": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.64.0.tgz", - "integrity": "sha512-K1sHO3ODBFCr7uEiCQ4RvVr+cQg0EHQF8ChVPnecGh/WDD8udrTq9ECwB0dRfMjAvlsHtRUlJm6ZSI8UPgum2w==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "babel-preset-fbjs": "^3.3.0", - "metro-babel-transformer": "0.64.0", - "metro-react-native-babel-preset": "0.64.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/metro-resolver": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.64.0.tgz", - "integrity": "sha512-cJ26Id8Zf+HmS/1vFwu71K3u7ep/+HeXXAJIeVDYf+niE7AWB9FijyMtAlQgbD8elWqv1leJCnQ/xHRFBfGKYA==", - "peer": true, - "dependencies": { - "absolute-path": "^0.0.0" - } - }, - "node_modules/metro-runtime": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.64.0.tgz", - "integrity": "sha512-m7XbWOaIOeFX7YcxUhmnOi6Pg8EaeL89xyZ+quZyZVF1aNoTr4w8FfbKxvijpjsytKHIZtd+43m2Wt5JrqyQmQ==", - "peer": true - }, - "node_modules/metro-source-map": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.64.0.tgz", - "integrity": "sha512-OCG2rtcp5cLEGYvAbfkl6mEc0J2FPRP4/UCEly+juBk7hawS9bCBMBfhJm/HIsvY1frk6nT2Vsl1O8YBbwyx2g==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.64.0", - "nullthrows": "^1.1.1", - "ob1": "0.64.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.64.0.tgz", - "integrity": "sha512-qIi+YRrDWnLVmydj6gwidYLPaBsakZRibGWSspuXgHAxOI3UuLwlo4dpQ73Et0gyHjI7ZvRMRY8JPiOntf9AQQ==", - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.64.0.tgz", - "integrity": "sha512-iTIRBD/wBI98plfxj8jAoNUUXfXLNlyvcjPtshhpGvdwu9pzQilGfnDnOaaK+vbITcOk9w5oQectXyJwAqTr1A==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "nullthrows": "^1.1.1" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.64.0.tgz", - "integrity": "sha512-wegRtK8GyLF6IPZRBJp+zsORgA4iX0h1DRpknyAMDCtSbJ4VU2xV/AojteOgAsDvY3ucAGsvfuZLNDJHUdUNHQ==", - "peer": true, - "dependencies": { - "@babel/core": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/parser": "^7.0.0", - "@babel/types": "^7.0.0", - "babel-preset-fbjs": "^3.3.0", - "metro": "0.64.0", - "metro-babel-transformer": "0.64.0", - "metro-cache": "0.64.0", - "metro-cache-key": "0.64.0", - "metro-hermes-compiler": "0.64.0", - "metro-source-map": "0.64.0", - "metro-transform-plugins": "0.64.0", - "nullthrows": "^1.1.1" - } - }, - "node_modules/metro/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/metro/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==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/metro/node_modules/chalk": { + "node_modules/jest-validate/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", @@ -10603,18 +11065,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/metro/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/metro/node_modules/color-convert": { + "node_modules/jest-validate/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==", @@ -10626,39 +11077,48 @@ "node": ">=7.0.0" } }, - "node_modules/metro/node_modules/color-name": { + "node_modules/jest-validate/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==", "peer": true }, - "node_modules/metro/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/jest-validate/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==", "peer": true, - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/metro/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==", - "peer": true + "node_modules/jest-validate/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==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/metro/node_modules/fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/metro/node_modules/has-flag": { + "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==", @@ -10667,528 +11127,620 @@ "node": ">=8" } }, - "node_modules/metro/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==", + "node_modules/jest-worker/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==", "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/metro/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "node_modules/jetifier": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", + "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==", "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "bin": { + "jetifier": "bin/jetify", + "jetifier-standalone": "bin/jetifier-standalone", + "jetify": "bin/jetify" } }, - "node_modules/metro/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "node_modules/joi": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz", + "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==", + "peer": true, + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", "peer": true }, - "node_modules/metro/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/metro/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "node_modules/jsc-android": { + "version": "245459.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", + "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==", + "peer": true + }, + "node_modules/jscodeshift": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.11.0.tgz", + "integrity": "sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g==", "peer": true, "dependencies": { - "ansi-regex": "^5.0.0" + "@babel/core": "^7.1.6", + "@babel/parser": "^7.1.6", + "@babel/plugin-proposal-class-properties": "^7.1.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.1.0", + "@babel/plugin-proposal-optional-chaining": "^7.1.0", + "@babel/plugin-transform-modules-commonjs": "^7.1.0", + "@babel/preset-flow": "^7.0.0", + "@babel/preset-typescript": "^7.1.0", + "@babel/register": "^7.0.0", + "babel-core": "^7.0.0-bridge.0", + "colors": "^1.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^3.1.10", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.20.3", + "temp": "^0.8.1", + "write-file-atomic": "^2.3.0" }, - "engines": { - "node": ">=8" + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" } }, - "node_modules/metro/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==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/metro/node_modules/temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "engines": [ - "node >=0.8.0" - ], - "peer": true, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "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==", "dependencies": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/metro/node_modules/temp/node_modules/rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "peer": true, - "bin": { - "rimraf": "bin.js" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/metro/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "peer": true, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "peer": true + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/metro/node_modules/ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "peer": true, - "dependencies": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/metro/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "peer": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" + "optionalDependencies": { + "graceful-fs": "^4.1.9" } }, - "node_modules/metro/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { "node": ">=6" } }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "language-subtag-registry": "~0.3.2" } }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "peer": true, + "engines": { + "node": ">=6" + } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=4.3.0 <5.0.0 || >=5.10" } }, - "node_modules/mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "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": { - "mime-db": "1.47.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=4.0.0" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "peer": true, - "engines": { - "node": ">=4" + "node_modules/loader-utils/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/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" + "p-locate": "^4.1.0" }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "engines": { + "node": ">=8" } }, - "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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "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=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", + "peer": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "chalk": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "peer": true, "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" }, + "bin": { + "logkitty": "bin/logkitty.js" + } + }, + "node_modules/logkitty/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "peer": true, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "node_modules/logkitty/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==", + "peer": true, "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/logkitty/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "peer": true, "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, + "node_modules/logkitty/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==", + "peer": true, "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/logkitty/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==", + "peer": 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, + "node_modules/logkitty/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, + "node_modules/logkitty/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "peer": true, "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, - "bin": { - "multicast-dns": "cli.js" + "engines": { + "node": ">=8" } }, - "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/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true + "node_modules/logkitty/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/logkitty/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=8" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "node_modules/logkitty/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "peer": true, "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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==", + "node_modules/logkitty/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "node_modules/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==" }, - "node_modules/nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/nise/node_modules/lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "yallist": "^3.0.2" } }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "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": { - "lower-case": "^1.1.1" + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nocache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", - "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "peer": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "peer": true, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dependencies": { - "minimatch": "^3.0.2" + "object-visit": "^1.0.0" }, "engines": { - "node": ">= 0.10.5" + "node": ">=0.10.0" } }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "engines": { - "node": "4.x || >=6.0.0" + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "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": ">= 6.0.0" + "node": ">= 0.6" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "peer": true - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, - "node_modules/node-libs-browser/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/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/node-libs-browser/node_modules/readable-stream": { + "node_modules/memory-fs/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==", @@ -11203,7 +11755,7 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/node-libs-browser/node_modules/string_decoder": { + "node_modules/memory-fs/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", @@ -11212,3494 +11764,3469 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/node-libs-browser/node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "peer": true, - "engines": { - "node": ">=0.10.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/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + "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==", + "peer": true }, - "node_modules/node-stream-zip": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.3.tgz", - "integrity": "sha512-Vv95ug+8Jfug4AxcqNV7TeGEk2antNidj+YBOyP8SS8LTHJmjsE3d9h6L831eJtO8p7jesJ3CDtgkwmLO/wcSw==", - "peer": 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": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "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": ">=8" + "node": ">= 0.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==", - "engines": { - "node": ">=0.10.0" + "node_modules/metro": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.64.0.tgz", + "integrity": "sha512-G2OC08Rzfs0kqnSEuKo2yZxR+/eNUpA93Ru45c60uN0Dw3HPrDi+ZBipgFftC6iLE0l+6hu8roFFIofotWxybw==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "absolute-path": "^0.0.0", + "accepts": "^1.3.7", + "async": "^2.4.0", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "fs-extra": "^1.0.0", + "graceful-fs": "^4.1.3", + "image-size": "^0.6.0", + "invariant": "^2.2.4", + "jest-haste-map": "^26.5.2", + "jest-worker": "^26.0.0", + "lodash.throttle": "^4.1.1", + "metro-babel-register": "0.64.0", + "metro-babel-transformer": "0.64.0", + "metro-cache": "0.64.0", + "metro-cache-key": "0.64.0", + "metro-config": "0.64.0", + "metro-core": "0.64.0", + "metro-hermes-compiler": "0.64.0", + "metro-inspector-proxy": "0.64.0", + "metro-minify-uglify": "0.64.0", + "metro-react-native-babel-preset": "0.64.0", + "metro-resolver": "0.64.0", + "metro-runtime": "0.64.0", + "metro-source-map": "0.64.0", + "metro-symbolicate": "0.64.0", + "metro-transform-plugins": "0.64.0", + "metro-transform-worker": "0.64.0", + "mime-types": "^2.1.27", + "mkdirp": "^0.5.1", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "rimraf": "^2.5.4", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "temp": "0.8.3", + "throat": "^5.0.0", + "ws": "^1.1.5", + "yargs": "^15.3.1" + }, + "bin": { + "metro": "src/cli.js" } }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "node_modules/metro-babel-register": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.64.0.tgz", + "integrity": "sha512-Kf6YvE3kIRumGnjK0Q9LqGDIdnsX9eFGtNBmBuCVDuB9wGGA/5CgX8We8W7Y44dz1RGTcHJRhfw5iGg+pwC3aQ==", + "peer": true, "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "escape-string-regexp": "^1.0.5" } }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, + "node_modules/metro-babel-transformer": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.64.0.tgz", + "integrity": "sha512-itZaxKTgmKGEZWxNzbSZBc22NngrMZzoUNuU92aHSTGkYi2WH4XlvzEHsstmIKHMsRVKl75cA+mNmgk4gBFJKw==", + "peer": true, "dependencies": { - "boolbase": "~1.0.0" + "@babel/core": "^7.0.0", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "peer": true + "node_modules/metro-cache": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.64.0.tgz", + "integrity": "sha512-QvGfxe/1QQYM9XOlR8W1xqE9eHDw/AgJIgYGn/TxZxBu9Zga+Rgs1omeSZju45D8w5VWgMr83ma5kACgzvOecg==", + "peer": true, + "dependencies": { + "metro-core": "0.64.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4" + } }, - "node_modules/ob1": { + "node_modules/metro-cache-key": { "version": "0.64.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.64.0.tgz", - "integrity": "sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.64.0.tgz", + "integrity": "sha512-O9B65G8L/fopck45ZhdRosyVZdMtUQuX5mBWEC1NRj02iWBIUPLmYMjrunqIe8vHipCMp3DtTCm/65IlBmO8jg==", "peer": true }, - "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=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "node_modules/metro-config": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.64.0.tgz", + "integrity": "sha512-QhM4asnX5KhlRWaugwVGNNXhX0Z85u5nK0UQ/A90bBb4xWyXqUe20e788VtdA75rkQiiI6wXTCIHWT0afbnjwQ==", + "peer": true, "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" + "cosmiconfig": "^5.0.5", + "jest-validate": "^26.5.2", + "metro": "0.64.0", + "metro-cache": "0.64.0", + "metro-core": "0.64.0", + "metro-runtime": "0.64.0" } }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/metro-core": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.64.0.tgz", + "integrity": "sha512-v8ZQ5j72EaUwamQ8pLfHlOHTyp7SbdazvHPzFGDpHnwIQqIT0Bw3Syg8R4regTlVG3ngpeSEAi005UITljmMcQ==", + "peer": true, + "dependencies": { + "jest-haste-map": "^26.5.2", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.64.0" } }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/metro-hermes-compiler": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.64.0.tgz", + "integrity": "sha512-CLAjVDWGAoGhbi2ZyPHnH5YDdfrDIx6+tzFWfHGIMTZkYBXsYta9IfYXBV8lFb6BIbrXLjlXZAOoosknetMPOA==", + "peer": true + }, + "node_modules/metro-inspector-proxy": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.64.0.tgz", + "integrity": "sha512-KywbH3GNSz9Iqw4UH3smgaV2dBHHYMISeN7ORntDL/G+xfgPc6vt13d+zFb907YpUcXj5N0vdoiAHI5V/0y8IA==", + "peer": true, "dependencies": { - "kind-of": "^3.0.2" + "connect": "^3.6.5", + "debug": "^2.2.0", + "ws": "^1.1.5", + "yargs": "^15.3.1" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "metro-inspector-proxy": "src/cli.js" } }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, + "node_modules/metro-inspector-proxy/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/metro-inspector-proxy/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==", + "peer": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" + "node_modules/metro-inspector-proxy/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/metro-inspector-proxy/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==", + "peer": true, "dependencies": { - "is-buffer": "^1.1.5" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/metro-inspector-proxy/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==", + "peer": true }, - "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, + "node_modules/metro-inspector-proxy/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ms": "2.0.0" } }, - "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==", + "node_modules/metro-inspector-proxy/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==", + "peer": true + }, + "node_modules/metro-inspector-proxy/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==", + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "node_modules/metro-inspector-proxy/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "peer": true + }, + "node_modules/metro-inspector-proxy/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "peer": true, "dependencies": { - "isobject": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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==", + "node_modules/metro-inspector-proxy/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "peer": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "ansi-regex": "^5.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dev": true, + "node_modules/metro-inspector-proxy/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "node_modules/metro-inspector-proxy/node_modules/ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "peer": true, "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "options": ">=0.0.5", + "ultron": "1.0.x" } }, - "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=", + "node_modules/metro-inspector-proxy/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "peer": true, "dependencies": { - "ee-first": "1.1.1" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "node_modules/metro-inspector-proxy/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "peer": true, "dependencies": { - "mimic-fn": "^1.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "node_modules/metro-minify-uglify": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.64.0.tgz", + "integrity": "sha512-DRwRstqXR5qfte9Nuwoov5dRXxL7fJeVlO5fGyOajWeO3+AgPjvjXh/UcLJqftkMWTPGUFuzAD5/7JC5v5FLWw==", "peer": true, "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" + "uglify-es": "^3.1.9" } }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, + "node_modules/metro-react-native-babel-preset": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", + "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", + "peer": true, "dependencies": { - "is-wsl": "^1.1.0" + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "*" } }, - "node_modules/options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "node_modules/metro-react-native-babel-transformer": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.64.0.tgz", + "integrity": "sha512-K1sHO3ODBFCr7uEiCQ4RvVr+cQg0EHQF8ChVPnecGh/WDD8udrTq9ECwB0dRfMjAvlsHtRUlJm6ZSI8UPgum2w==", "peer": true, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "@babel/core": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "metro-babel-transformer": "0.64.0", + "metro-react-native-babel-preset": "0.64.0", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1" + }, + "peerDependencies": { + "@babel/core": "*" } }, - "node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "node_modules/metro-resolver": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.64.0.tgz", + "integrity": "sha512-cJ26Id8Zf+HmS/1vFwu71K3u7ep/+HeXXAJIeVDYf+niE7AWB9FijyMtAlQgbD8elWqv1leJCnQ/xHRFBfGKYA==", "peer": true, "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=6" + "absolute-path": "^0.0.0" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "node_modules/metro-runtime": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.64.0.tgz", + "integrity": "sha512-m7XbWOaIOeFX7YcxUhmnOi6Pg8EaeL89xyZ+quZyZVF1aNoTr4w8FfbKxvijpjsytKHIZtd+43m2Wt5JrqyQmQ==", + "peer": true + }, + "node_modules/metro-source-map": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.64.0.tgz", + "integrity": "sha512-OCG2rtcp5cLEGYvAbfkl6mEc0J2FPRP4/UCEly+juBk7hawS9bCBMBfhJm/HIsvY1frk6nT2Vsl1O8YBbwyx2g==", "peer": true, - "engines": { - "node": ">=6" + "dependencies": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.64.0", + "nullthrows": "^1.1.1", + "ob1": "0.64.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/metro-symbolicate": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.64.0.tgz", + "integrity": "sha512-qIi+YRrDWnLVmydj6gwidYLPaBsakZRibGWSspuXgHAxOI3UuLwlo4dpQ73Et0gyHjI7ZvRMRY8JPiOntf9AQQ==", "peer": true, "dependencies": { - "ansi-regex": "^4.1.0" + "invariant": "^2.2.4", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" }, "engines": { - "node": ">=6" + "node": ">=8.3" } }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, + "node_modules/metro-transform-plugins": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.64.0.tgz", + "integrity": "sha512-iTIRBD/wBI98plfxj8jAoNUUXfXLNlyvcjPtshhpGvdwu9pzQilGfnDnOaaK+vbITcOk9w5oQectXyJwAqTr1A==", + "peer": true, "dependencies": { - "url-parse": "^1.4.3" + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "nullthrows": "^1.1.1" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "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=", + "node_modules/metro-transform-worker": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.64.0.tgz", + "integrity": "sha512-wegRtK8GyLF6IPZRBJp+zsORgA4iX0h1DRpknyAMDCtSbJ4VU2xV/AojteOgAsDvY3ucAGsvfuZLNDJHUdUNHQ==", "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "metro": "0.64.0", + "metro-babel-transformer": "0.64.0", + "metro-cache": "0.64.0", + "metro-cache-key": "0.64.0", + "metro-hermes-compiler": "0.64.0", + "metro-source-map": "0.64.0", + "metro-transform-plugins": "0.64.0", + "nullthrows": "^1.1.1" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "node_modules/metro/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "peer": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "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==", + "node_modules/metro/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==", + "peer": true, "dependencies": { - "p-try": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/p-locate": { + "node_modules/metro/node_modules/chalk": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "peer": true, "dependencies": { - "p-limit": "^2.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, + "node_modules/metro/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "peer": true, "dependencies": { - "retry": "^0.12.0" - }, - "engines": { - "node": ">=6" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "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==", + "node_modules/metro/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==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/paho-mqtt": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/paho-mqtt/-/paho-mqtt-1.1.0.tgz", - "integrity": "sha512-KPbL9KAB0ASvhSDbOrZBaccXS+/s7/LIofbPyERww8hM5Ko71GUJQ6Nmg0BWqj8phAIT8zdf/Sd/RftHU9i2HA==" - }, - "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/metro/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==", + "peer": true }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "ms": "2.0.0" } }, - "node_modules/parallel-transform/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, + "node_modules/metro/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==", + "peer": true + }, + "node_modules/metro/node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "peer": 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" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" } }, - "node_modules/parallel-transform/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "node_modules/metro/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==", + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" + "node_modules/metro/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==", + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "node_modules/metro/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "node_modules/metro/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "peer": true + }, + "node_modules/metro/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "peer": true, "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/metro/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "node_modules/metro/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==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, + "node_modules/metro/node_modules/temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "engines": [ + "node >=0.8.0" + ], + "peer": true, "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" } }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "node_modules/metro/node_modules/temp/node_modules/rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "peer": true, + "bin": { + "rimraf": "bin.js" + } }, - "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==", + "node_modules/metro/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "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=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "node_modules/metro/node_modules/ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "peer": true, "dependencies": { - "isarray": "0.0.1" + "options": ">=0.0.5", + "ultron": "1.0.x" } }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, + "node_modules/metro/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "peer": true, "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "engines": { - "node": ">=8.6" + "node_modules/metro/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "engines": { "node": ">=6" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "dependencies": { - "pinkie": "^2.0.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "peer": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "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" - }, + "node_modules/mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", - "peer": true, + "node_modules/mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "dependencies": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.5.0" + "mime-db": "1.47.0" }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "engines": { + "node": ">=4" } }, - "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, + "node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" }, - "engines": { - "node": ">= 0.12.0" + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.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/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/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true }, - "node_modules/postcss": { - "version": "8.2.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", - "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", - "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==", "dependencies": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map": "^0.6.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": "*" } }, - "node_modules/postcss-modules-extract-imports": { + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mississippi": { "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==", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=4.0.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, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "minimist": "^1.2.5" }, - "peerDependencies": { - "postcss": "^8.1.0" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "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==", + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, - "node_modules/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==", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" }, - "peerDependencies": { - "postcss": "^8.1.0" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "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/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "node_modules/nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/postcss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "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==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", - "dev": true, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" } }, - "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "peer": true, + "node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" + "@sinonjs/commons": "^1.7.0" } }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", "peer": true, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/pretty-format/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==", + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "minimatch": "^3.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 0.10.5" } }, - "node_modules/pretty-format/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==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", "engines": { - "node": ">=7.0.0" + "node": "4.x || >=6.0.0" } }, - "node_modules/pretty-format/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==", - "peer": true - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "peer": true - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">= 6.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "peer": true }, - "node_modules/promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "peer": true, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, "dependencies": { - "asap": "~2.0.6" + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "node_modules/node-libs-browser/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/prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "peer": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true }, - "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "node_modules/node-libs-browser/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": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "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/prop-types-extra": { + "node_modules/node-libs-browser/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "node_modules/node-libs-browser/node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "dependencies": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - }, + "inherits": "2.0.3" + } + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "peer": true, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "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 + "node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "node_modules/node-stream-zip": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.3.tgz", + "integrity": "sha512-Vv95ug+8Jfug4AxcqNV7TeGEk2antNidj+YBOyP8SS8LTHJmjsE3d9h6L831eJtO8p7jesJ3CDtgkwmLO/wcSw==", + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "engines": { + "node": ">=8" + } }, - "node_modules/pump": { + "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "boolbase": "~1.0.0" } }, - "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/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "peer": true }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true, - "engines": { - "node": ">=0.6" - } + "node_modules/ob1": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.64.0.tgz", + "integrity": "sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==", + "peer": true }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "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=", "engines": { - "node": ">=0.4.x" + "node": ">=0.10.0" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, "engines": { - "node": ">=0.4.x" + "node": ">=0.10.0" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dependencies": { - "safe-buffer": "^5.1.0" + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.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==", + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/react-bootstrap": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.5.2.tgz", - "integrity": "sha512-mGKPY5+lLd7Vtkx2VFivoRkPT4xAHazuFfIhJLTEgHlDfIUSePn7qrmpZe5gXH9zvHV0RsBaQ9cLfXjxnZrOpA==", - "dependencies": { - "@babel/runtime": "^7.13.8", - "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.26", - "@types/classnames": "^2.2.10", - "@types/invariant": "^2.2.33", - "@types/prop-types": "^15.7.3", - "@types/react": ">=16.9.35", - "@types/react-transition-group": "^4.4.1", - "@types/warning": "^3.0.0", - "classnames": "^2.2.6", - "dom-helpers": "^5.1.2", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "prop-types-extra": "^1.1.0", - "react-overlays": "^5.0.0", - "react-transition-group": "^4.4.1", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-devtools-core": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.12.2.tgz", - "integrity": "sha512-cvAiJCSIIan2A22o4j4Twc7PdDrwqiAQVBeZ+osS2T/wv2Ua3a0J8Sgx4pTH5Y7VoWn5WiGCHkAW4S1lYl3kcA==", - "peer": true, + "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": { - "shell-quote": "^1.6.1", - "ws": "^7" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", - "peer": true, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">= 0.4" } }, - "node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" + "isobject": "^3.0.0" }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/react-hooks-helper": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/react-hooks-helper/-/react-hooks-helper-1.6.0.tgz", - "integrity": "sha512-DlyWQ99tgwyDdJfTihCXT6AftYymxhA2LS60vBCTOpclmjPxqDwDTLjVK0kbIc3XsgJvxkanW8TwHE0jrIB8hA==", - "peerDependencies": { - "react": "^16.8.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-native-codegen": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.6.tgz", - "integrity": "sha512-cMvrUelD81wiPitEPiwE/TCNscIVauXxmt4NTGcy18HrUd0WRWXfYzAQGXm0eI87u3NMudNhqFj2NISJenxQHg==", - "peer": true, + "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==", "dependencies": { - "flow-parser": "^0.121.0", - "jscodeshift": "^0.11.0", - "nullthrows": "^1.1.1" + "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/react-overlays": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.0.0.tgz", - "integrity": "sha512-TKbqfAv23TFtCJ2lzISdx76p97G/DP8Rp4TOFdqM9n8GTruVYgE3jX7Zgb8+w7YJ18slTVcDTQ1/tFzdCqjVhA==", + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.12.1", - "@popperjs/core": "^2.5.3", - "@restart/hooks": "^0.3.25", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.2.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.0.0", - "warning": "^4.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" + "engines": { + "node": ">= 0.4" } }, - "node_modules/react-redux": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.3.tgz", - "integrity": "sha512-ZhAmQ1lrK+Pyi0ZXNMUZuYxYAZd59wFuVDGUt536kSGdD0ya9Q7BfsE95E3TsFLE3kOSFp5m6G5qbatE+Ic1+w==", + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/react-redux": "^7.1.16", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^16.13.1" - }, - "peerDependencies": { - "react": "^16.8.3 || ^17", - "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", - "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", - "peer": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "react": ">=15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" + "engines": { + "node": ">= 0.8" }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dependencies": { - "picomatch": "^2.2.1" + "isobject": "^3.0.1" }, "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" } }, - "node_modules/recast": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.4.tgz", - "integrity": "sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==", - "peer": true, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, "dependencies": { - "ast-types": "0.14.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, "engines": { - "node": ">= 4" - } - }, - "node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/recast/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "peer": true + "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/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "peer": 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=", "dependencies": { - "resolve": "^1.1.6" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.8" } }, - "node_modules/redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", - "dependencies": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/redux-logger": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-4.0.0.tgz", - "integrity": "sha512-dl+5mQjk70HIlrgOgPMAL0d0hOhBTPQcG5zPPlPZKa/Yf4lU6A37mv3Xqn3lFp0eUguSApIa2GD/YJVOIQQi5A==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dependencies": { - "deep-diff": "^0.3.5" + "wrappy": "1" } }, - "node_modules/redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "peer": true, "dependencies": { - "regenerate": "^1.4.0" + "mimic-fn": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "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==", + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "peer": true, "dependencies": { - "@babel/runtime": "^7.8.4" + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "is-wsl": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dependencies": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - }, + "node_modules/options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "peer": true, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "node_modules/regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "peer": true, "dependencies": { - "jsesc": "~0.5.0" + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": ">=6" } }, - "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=", - "bin": { - "jsesc": "bin/jsesc" + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "node_modules/renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "dependencies": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" - } - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "engines": { - "node": ">=0.10.0" + "url-parse": "^1.4.3" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true }, - "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=", + "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=", + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/requires-port": { + "node_modules/p-finally": { "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.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" } }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "resolve-from": "^3.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/resolve-dir/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/resolve-dir/node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dev": true, "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "retry": "^0.12.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + "node_modules/paho-mqtt": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/paho-mqtt/-/paho-mqtt-1.1.0.tgz", + "integrity": "sha512-KPbL9KAB0ASvhSDbOrZBaccXS+/s7/LIofbPyERww8hM5Ko71GUJQ6Nmg0BWqj8phAIT8zdf/Sd/RftHU9i2HA==" }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" + "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/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "peer": true, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "node_modules/parallel-transform/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, - "engines": { - "node": ">= 4" + "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/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/parallel-transform/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "safe-buffer": "~5.1.0" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "no-case": "^2.2.0" } }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "peer": 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.* || >= 7.*" + "node": ">=6" } }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "node_modules/parent-module/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, - "dependencies": { - "aproba": "^1.1.1" + "engines": { + "node": ">=6" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, "dependencies": { - "ret": "~0.1.10" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "node_modules/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/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "peer": true, "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "peer": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "node": ">=4" } }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "peer": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "peer": true - }, - "node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/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" - }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=0.10.0" } }, - "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": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", "dev": true, "dependencies": { - "node-forge": "^0.10.0" + "process": "^0.11.1", + "util": "^0.10.3" } }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/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=", + "engines": { + "node": ">=0.10.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=" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", - "peer": true, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/serialize-javascript": { + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=8" } }, - "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=", + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "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" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.12" } }, - "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==", + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true, - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=0.10.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=", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "pinkie": "^2.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "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.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "peer": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" + "node-modules-regexp": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 6" } }, - "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=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "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": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "find-up": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/plist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", + "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", + "peer": true, "dependencies": { - "is-extendable": "^0.1.0" + "base64-js": "^1.5.1", + "xmlbuilder": "^9.0.7", + "xmldom": "^0.5.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "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": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" }, - "bin": { - "sha.js": "bin.js" + "engines": { + "node": ">= 0.12.0" } }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "ms": "^2.1.1" } }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "engines": { "node": ">=0.10.0" } }, - "node_modules/shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "peer": true, - "dependencies": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "node_modules/shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "peer": true, + "node_modules/postcss": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", + "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "dev": true, "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map": "^0.6.1" }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/simple-plist": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", - "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", - "peer": true, - "dependencies": { - "bplist-creator": "0.0.8", - "bplist-parser": "0.2.0", - "plist": "^3.0.1" + "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/sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "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": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.3", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.2", - "supports-color": "^5.5.0" + "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/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "peer": true - }, - "node_modules/slash": { + "node_modules/postcss-modules-scope": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "peer": true, + "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": ">=8" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "peer": true, + "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": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "icss-utils": "^5.0.0" }, "engines": { - "node": ">=6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "node_modules/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" + "node_modules/prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "fast-diff": "^1.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "lodash": "^4.17.20", + "renderkid": "^2.0.4" } }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "peer": true, "dependencies": { - "is-descriptor": "^0.1.0" + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/pretty-format/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==", + "peer": true, "dependencies": { - "kind-of": "^3.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" + "node_modules/pretty-format/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==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, + "node_modules/pretty-format/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==", + "peer": true + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6.0" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "peer": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" + "asap": "~2.0.6" } }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } + "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/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } }, - "node_modules/sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", - "dev": true, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" } }, - "node_modules/sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "dev": true, "dependencies": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "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 + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "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==", + "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": ">=0.10.0" + "node": ">=6" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "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": ">=0.6" } }, - "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/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "engines": { + "node": ">=0.4.x" } }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.x" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "peer": true + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "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, - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "peer": 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/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "peer": true, + "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": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" + "safe-buffer": "^5.1.0" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "dependencies": { - "kind-of": "^3.0.2" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/react-bootstrap": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.5.2.tgz", + "integrity": "sha512-mGKPY5+lLd7Vtkx2VFivoRkPT4xAHazuFfIhJLTEgHlDfIUSePn7qrmpZe5gXH9zvHV0RsBaQ9cLfXjxnZrOpA==", "dependencies": { - "is-buffer": "^1.1.5" + "@babel/runtime": "^7.13.8", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.3.26", + "@types/classnames": "^2.2.10", + "@types/invariant": "^2.2.33", + "@types/prop-types": "^15.7.3", + "@types/react": ">=16.9.35", + "@types/react-transition-group": "^4.4.1", + "@types/warning": "^3.0.0", + "classnames": "^2.2.6", + "dom-helpers": "^5.1.2", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^5.0.0", + "react-transition-group": "^4.4.1", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/react-devtools-core": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.12.2.tgz", + "integrity": "sha512-cvAiJCSIIan2A22o4j4Twc7PdDrwqiAQVBeZ+osS2T/wv2Ua3a0J8Sgx4pTH5Y7VoWn5WiGCHkAW4S1lYl3kcA==", + "peer": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" + "shell-quote": "^1.6.1", + "ws": "^7" } }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" + "node_modules/react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" } }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "node_modules/react-hooks-helper": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-hooks-helper/-/react-hooks-helper-1.6.0.tgz", + "integrity": "sha512-DlyWQ99tgwyDdJfTihCXT6AftYymxhA2LS60vBCTOpclmjPxqDwDTLjVK0kbIc3XsgJvxkanW8TwHE0jrIB8hA==", + "peerDependencies": { + "react": "^16.8.0" } }, - "node_modules/stream-browserify/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/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/stream-browserify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "node_modules/react-native-codegen": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.6.tgz", + "integrity": "sha512-cMvrUelD81wiPitEPiwE/TCNscIVauXxmt4NTGcy18HrUd0WRWXfYzAQGXm0eI87u3NMudNhqFj2NISJenxQHg==", "peer": true, - "engines": { - "node": ">= 0.10.0" + "dependencies": { + "flow-parser": "^0.121.0", + "jscodeshift": "^0.11.0", + "nullthrows": "^1.1.1" } }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, + "node_modules/react-overlays": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.0.0.tgz", + "integrity": "sha512-TKbqfAv23TFtCJ2lzISdx76p97G/DP8Rp4TOFdqM9n8GTruVYgE3jX7Zgb8+w7YJ18slTVcDTQ1/tFzdCqjVhA==", "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "@babel/runtime": "^7.12.1", + "@popperjs/core": "^2.5.3", + "@restart/hooks": "^0.3.25", + "@types/warning": "^3.0.0", + "dom-helpers": "^5.2.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" } }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, + "node_modules/react-redux": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.3.tgz", + "integrity": "sha512-ZhAmQ1lrK+Pyi0ZXNMUZuYxYAZd59wFuVDGUt536kSGdD0ya9Q7BfsE95E3TsFLE3kOSFp5m6G5qbatE+Ic1+w==", "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "@babel/runtime": "^7.12.1", + "@types/react-redux": "^7.1.16", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.13.1" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17", + "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } } }, - "node_modules/stream-http/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/react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/stream-http/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, + "node_modules/react-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", "dependencies": { - "safe-buffer": "~5.1.0" + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" } }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "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, + "node_modules/react-router-dom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", "dependencies": { - "safe-buffer": "~5.2.0" + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" } }, - "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": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "node_modules/react-transition-group": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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": ">= 6" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, + "optional": true, "dependencies": { - "ansi-regex": "^4.1.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=6" + "node": ">=8.10.0" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, + "node_modules/recast": { + "version": "0.20.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.4.tgz", + "integrity": "sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==", + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "ast-types": "0.14.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 4" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "engines": { - "node": ">=0.10.0" - } + "node_modules/recast/node_modules/tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "peer": true }, - "node_modules/style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "dev": true, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "peer": true, "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "resolve": "^1.1.6" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": ">= 0.10" } }, - "node_modules/style-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, + "node_modules/redux": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" } }, - "node_modules/style-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, + "node_modules/redux-logger": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-4.0.0.tgz", + "integrity": "sha512-dl+5mQjk70HIlrgOgPMAL0d0hOhBTPQcG5zPPlPZKa/Yf4lU6A37mv3Xqn3lFp0eUguSApIa2GD/YJVOIQQi5A==", "dependencies": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "deep-diff": "^0.3.5" } }, - "node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "peer": true + "node_modules/redux-thunk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" }, - "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==", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dependencies": { - "has-flag": "^3.0.0" + "regenerate": "^1.4.0" }, "engines": { "node": ">=4" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "peer": 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==", "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" + "@babel/runtime": "^7.8.4" } }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "peer": true, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dependencies": { - "glob": "^7.1.3" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=8" }, - "peerDependencies": { - "webpack": "^4.0.0" + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/terser-webpack-plugin/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dependencies": { - "locate-path": "^3.0.0" + "jsesc": "~0.5.0" }, - "engines": { - "node": ">=6" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/terser-webpack-plugin/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" + "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=", + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/terser-webpack-plugin/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==", + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, "engines": { - "node": ">=6" + "node": ">= 0.10" } }, - "node_modules/terser-webpack-plugin/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "node_modules/renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", "dev": true, "dependencies": { - "p-limit": "^2.0.0" - }, + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "engines": { - "node": ">=4" + "node": ">=0.10" } }, - "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, + "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=", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" }, - "engines": { - "node": ">= 4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terser-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "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==", + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/resolve-dir/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "peer": true - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/resolve-dir/node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/through2/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==", - "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/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" } }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, - "node_modules/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/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "peer": true, "dependencies": { - "setimmediate": "^1.0.4" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=0.6.0" + "node": ">=4" } }, - "node_modules/tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + "node_modules/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/tmpl": { + "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "peer": true - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "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=", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { - "node": ">=4" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { - "kind-of": "^3.0.2" + "glob": "^7.1.3" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": "6.* || >= 7.*" } }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "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": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" } }, - "node_modules/toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "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/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "peer": true, - "engines": { - "node": ">=8" - } - }, - "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" + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" }, "engines": { - "node": ">= 0.6" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "peer": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } }, - "node_modules/uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "peer": true, "dependencies": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" + "remove-trailing-separator": "^1.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/uglify-es/node_modules/commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "peer": true }, - "node_modules/uglify-es/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==", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, - "node_modules/uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "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": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=0.8.0" + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "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/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "node-forge": "^0.10.0" } }, - "node_modules/ulid": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", - "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==", + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { - "ulid": "bin/cli.js" + "semver": "bin/semver.js" } }, - "node_modules/ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "peer": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" + "ms": "2.0.0" } }, - "node_modules/unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + "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=" }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", + "peer": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, "dependencies": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "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": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "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": ">=4" + "node": ">= 0.6" } }, - "node_modules/unicode-property-aliases-ecmascript": { + "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/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "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.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "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=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", + "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/union-value/node_modules/is-extendable": { + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", @@ -14707,418 +15234,589 @@ "node": ">=0.10.0" } }, - "node_modules/unique-filename": { + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "dependencies": { - "unique-slug": "^2.0.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" } }, - "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, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dependencies": { - "imurmurhash": "^0.1.4" + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/universal-cookie": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", - "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", - "dependencies": { - "@types/cookie": "^0.3.3", - "cookie": "^0.4.0" + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "peer": true, - "engines": { - "node": ">= 4.0.0" + "dependencies": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "peer": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/simple-plist": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", + "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", + "peer": true, + "dependencies": { + "bplist-creator": "0.0.8", + "bplist-parser": "0.2.0", + "plist": "^3.0.1" + } + }, + "node_modules/sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "dependencies": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "peer": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "peer": true, "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dependencies": { - "isarray": "1.0.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, "engines": { - "node": ">=4", - "yarn": "*" + "node": ">=0.10.0" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "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, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dependencies": { - "punycode": "^2.1.0" + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "ms": "2.0.0" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "peer": true, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dependencies": { - "object-assign": "^4.1.1" + "is-extendable": "^0.1.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dependencies": { - "inherits": "2.0.3" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.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=" - }, - "node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/util/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/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "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=", + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.10.0" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/validate.js": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz", - "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==" - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "peer": true + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "peer": true, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, "dependencies": { - "makeerror": "1.0.x" + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" } }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "node_modules/sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "dev": true, "dependencies": { - "loose-envify": "^1.0.0" + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" } }, - "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" + "ms": "^2.1.1" } }, - "node_modules/watchpack-chokidar2": { + "node_modules/source-list-map": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "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, - "optional": 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": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "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, - "optional": true, "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" }, - "optionalDependencies": { - "fsevents": "^1.2.7" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "peer": true + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "peer": true + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "peer": true, + "dependencies": { + "type-fest": "^0.7.1" }, "engines": { - "node": ">= 4.0" + "node": ">=6" } }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dependencies": { - "is-extglob": "^2.1.0" + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dependencies": { - "binary-extensions": "^1.0.0" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/readable-stream": { + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/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, - "optional": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15129,1101 +15827,2597 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "node_modules/stream-browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "optional": true, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "peer": true, "engines": { - "node": ">=0.10" + "node": ">= 0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, - "optional": true, "dependencies": { - "safe-buffer": "~5.1.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.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==", + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "dependencies": { - "minimalistic-assert": "^1.0.0" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "peer": true, + "node_modules/stream-http/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": { - "defaults": "^1.0.3" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "node_modules/stream-http/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "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" }, - "webpack-command": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - } + ] }, - "node_modules/webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "dependencies": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-cli": "bin/cli.js" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=6.11.5" - }, - "peerDependencies": { - "webpack": "4.x.x" + "node": ">=6" } }, - "node_modules/webpack-cli/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { "node": ">=6" } }, - "node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": ">=6" } }, - "node_modules/webpack-dev-middleware/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "node_modules/string.prototype.matchall": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", + "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", "dev": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" }, - "engines": { - "node": ">=4.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "dependencies": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 6.11.5" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "dependencies": { - "remove-trailing-separator": "^1.0.1" + "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "engines": { + "node": ">=8" }, - "optionalDependencies": { - "fsevents": "^1.2.7" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "engines": { - "node": ">= 4.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "node_modules/style-loader/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" } }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "node_modules/style-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "dependencies": { - "is-extglob": "^2.1.0" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "peer": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "binary-extensions": "^1.0.0" + "has-flag": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/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==", + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "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" + "engines": { + "node": ">=6" } }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, + "node_modules/temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "rimraf": "~2.6.2" }, "engines": { - "node": ">=0.10" + "node": ">=6.0.0" } }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" }, "engines": { - "node": ">= 4" + "node": ">=6.0.0" } }, - "node_modules/webpack-dev-server/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" } }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" + "locate-path": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/terser-webpack-plugin/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, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "p-limit": "^2.0.0" }, "engines": { - "node": ">= 4" + "node": ">=6" } }, - "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==", + "node_modules/terser-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "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": ">=4" } }, - "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==", + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "peer": true - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { - "isexe": "^2.0.0" + "find-up": "^3.0.0" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=6" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 4" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "dependencies": { - "errno": "~0.1.7" + "bin": { + "semver": "bin/semver" } }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "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, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "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/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "peer": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "peer": true, + "node_modules/through2/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==", "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "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/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "async-limiter": "~1.0.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/xcode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", - "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", - "peer": 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/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, "dependencies": { - "simple-plist": "^1.0.0", - "uuid": "^3.3.2" + "setimmediate": "^1.0.4" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.6.0" } }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "peer": true, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "peer": true + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "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=", "engines": { - "node": ">=4.0" + "node": ">=4" } }, - "node_modules/xmldoc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", - "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", - "peer": true, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dependencies": { - "sax": "^1.2.1" - } - }, - "node_modules/xmldom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", - "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", - "peer": true, + "kind-of": "^3.0.2" + }, "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { - "node": ">=0.4" + "node": ">=0.10.0" } }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", "dev": true }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "node_modules/tsconfig-paths": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" } }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/tsconfig-paths/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": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "tslib": "^1.8.1" }, "engines": { - "node": ">=6" + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "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": { - "p-limit": "^2.0.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=4" + "node": ">=4.2.0" } }, - "node_modules/zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "node_modules/zen-observable-ts": { - "version": "0.8.19", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.19.tgz", - "integrity": "sha512-u1a2rpE13G+jSzrg3aiCqXU5tN2kw41b+cBZGmnc+30YimdkKiDj9bTowcB41eL77/17RF/h+393AuVgShyheQ==", + "node_modules/uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "peer": true, "dependencies": { - "tslib": "^1.9.3", - "zen-observable": "^0.8.0" + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/zen-push": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/zen-push/-/zen-push-0.2.1.tgz", - "integrity": "sha512-Qv4qvc8ZIue51B/0zmeIMxpIGDVhz4GhJALBvnKs/FRa2T7jy4Ori9wFwaHVt0zWV7MIFglKAHbgnVxVTw7U1w==", + "node_modules/uglify-es/node_modules/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "peer": true + }, + "node_modules/uglify-es/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==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, "dependencies": { - "zen-observable": "^0.7.0" + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/zen-push/node_modules/zen-observable": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.7.1.tgz", - "integrity": "sha512-OI6VMSe0yeqaouIXtedC+F55Sr6r9ppS7+wTbSexkYdHbdt4ctTuPNXP/rwm7GTVI63YBc+EBT0b0tl7YnJLRg==" - } - }, - "dependencies": { - "@aws-amplify/analytics": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@aws-amplify/analytics/-/analytics-4.0.18.tgz", - "integrity": "sha512-nOwpubv0jGOo0IhzHKIui0kiAEQoZ+PchBv47D4yCffV2pYiMua6NllFsAmxkHLD8EYTg3MYe932HNmM6+gSzg==", - "requires": { - "@aws-amplify/cache": "3.1.55", - "@aws-amplify/core": "3.8.22", - "@aws-sdk/client-firehose": "3.6.1", - "@aws-sdk/client-kinesis": "3.6.1", - "@aws-sdk/client-personalize-events": "3.6.1", - "@aws-sdk/client-pinpoint": "3.6.1", - "@aws-sdk/util-utf8-browser": "3.6.1", - "lodash": "^4.17.20", - "uuid": "^3.2.1" + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "@aws-amplify/api": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@aws-amplify/api/-/api-3.2.30.tgz", - "integrity": "sha512-3nTDDNMuWA81kAUc+2eV7aMJSYdWR7z4CtvMB7UGcfiKlXjyCZdXahbYLqyn3UGvNoGkoITD2J7jZ9Rc4ndXJQ==", - "requires": { - "@aws-amplify/api-graphql": "1.2.30", - "@aws-amplify/api-rest": "1.2.30" + "node_modules/ulid": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", + "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==", + "bin": { + "ulid": "bin/cli.js" } }, - "@aws-amplify/api-graphql": { - "version": "1.2.30", - "resolved": "https://registry.npmjs.org/@aws-amplify/api-graphql/-/api-graphql-1.2.30.tgz", - "integrity": "sha512-qbkgKu8e0DD0ZXtMQ5b3uVJlqlC8EeEwhs3zy/BEKz51dUFDI5p6KMUYjbYVw8oNAgsFBXkMGCkhY+etXJNc6w==", - "requires": { - "@aws-amplify/api-rest": "1.2.30", - "@aws-amplify/auth": "3.4.30", - "@aws-amplify/cache": "3.1.55", - "@aws-amplify/core": "3.8.22", - "@aws-amplify/pubsub": "3.2.28", - "graphql": "14.0.0", - "uuid": "^3.2.1", - "zen-observable-ts": "0.8.19" - } + "node_modules/ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "peer": true }, - "@aws-amplify/api-rest": { - "version": "1.2.30", - "resolved": "https://registry.npmjs.org/@aws-amplify/api-rest/-/api-rest-1.2.30.tgz", - "integrity": "sha512-mvcQ+u+j9dv1v2rSMZ2I31sSimIAi45UXmOTAUAjHEac/u8OYlUyLKG2DcTs1QmFKxNL0CHWqi060amjIIhfYg==", - "requires": { - "@aws-amplify/core": "3.8.22", - "axios": "0.21.1" - }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, "dependencies": { - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "requires": { - "follow-redirects": "^1.10.0" - } - } + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@aws-amplify/auth": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@aws-amplify/auth/-/auth-3.4.30.tgz", - "integrity": "sha512-DYBDKU8JGZB8LRSVUj3BUKU/4qOcWkjfYoaVr3T3fvJvE2n2YOcXBVsYXUq24q1UlAuTfIbZQCrsbL7kBAxtAg==", - "requires": { - "@aws-amplify/cache": "3.1.55", - "@aws-amplify/core": "3.8.22", - "amazon-cognito-identity-js": "4.6.0", - "crypto-js": "^3.3.0" + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" } }, - "@aws-amplify/cache": { - "version": "3.1.55", - "resolved": "https://registry.npmjs.org/@aws-amplify/cache/-/cache-3.1.55.tgz", - "integrity": "sha512-3txk5bmC9wtijTaeKoAsype2rZiCfmYk6s8f5oiPo+dIU4a1mIliSHd8IAduKdOIbGdvJbzkzlplqXDQGJD+ng==", - "requires": { - "@aws-amplify/core": "3.8.22" - } + "node_modules/unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" }, - "@aws-amplify/core": { - "version": "3.8.22", - "resolved": "https://registry.npmjs.org/@aws-amplify/core/-/core-3.8.22.tgz", - "integrity": "sha512-Plw0Gr6ik223bjBch/YicIUAhYTIEc8W3hx52u8jawpGMi1bcwmNAiuMMBvlSl50edbhmPgIw24GtyZNHLYDgQ==", - "requires": { - "@aws-crypto/sha256-js": "1.0.0-alpha.0", - "@aws-sdk/client-cognito-identity": "3.6.1", - "@aws-sdk/credential-provider-cognito-identity": "3.6.1", - "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-hex-encoding": "3.6.1", - "universal-cookie": "^4.0.4", - "zen-observable-ts": "0.8.19" + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "engines": { + "node": ">=4" } }, - "@aws-amplify/datastore": { - "version": "2.9.16", - "resolved": "https://registry.npmjs.org/@aws-amplify/datastore/-/datastore-2.9.16.tgz", - "integrity": "sha512-YCJryQdpqVNF4S2dxkm46PoZ46rW0IJAcb2jHQuuUKa8lFXA5a2q4/cT8pakCGgVjmdaJXNUWlAZQu0CHapgRg==", - "requires": { - "@aws-amplify/api": "3.2.30", - "@aws-amplify/core": "3.8.22", - "@aws-amplify/pubsub": "3.2.28", - "idb": "5.0.6", - "immer": "8.0.1", - "ulid": "2.3.0", - "uuid": "3.3.2", - "zen-observable-ts": "0.8.19", - "zen-push": "0.2.1" - }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" } }, - "@aws-amplify/interactions": { - "version": "3.3.30", - "resolved": "https://registry.npmjs.org/@aws-amplify/interactions/-/interactions-3.3.30.tgz", - "integrity": "sha512-RFDU+pptmxR+cPD4JlFz5JMFG5wIbY1M8PIpzOEhWPf1cnpSAVeDq9zvXDnyir45UrLfHxvJ8I3ocAZeAEa51g==", - "requires": { - "@aws-amplify/core": "3.8.22", - "@aws-sdk/client-lex-runtime-service": "3.6.1" + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "engines": { + "node": ">=4" } }, - "@aws-amplify/predictions": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@aws-amplify/predictions/-/predictions-3.2.30.tgz", - "integrity": "sha512-dFv+FC4F/+RiX4m9/+SGWG4UHsssZiHTdrUxjHyXi2/9csFieG4GS78lhcEnk1/k4LGYvYwU0qtMwzO5tcZH4g==", - "requires": { - "@aws-amplify/core": "3.8.22", - "@aws-amplify/storage": "3.4.0", - "@aws-sdk/client-comprehend": "3.6.1", - "@aws-sdk/client-polly": "3.6.1", - "@aws-sdk/client-rekognition": "3.6.1", - "@aws-sdk/client-textract": "3.6.1", - "@aws-sdk/client-translate": "3.6.1", - "@aws-sdk/eventstream-marshaller": "3.6.1", - "@aws-sdk/util-utf8-node": "3.6.1", - "uuid": "^3.2.1" + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "engines": { + "node": ">=4" } }, - "@aws-amplify/pubsub": { - "version": "3.2.28", - "resolved": "https://registry.npmjs.org/@aws-amplify/pubsub/-/pubsub-3.2.28.tgz", - "integrity": "sha512-fsOHrs+EfKZDcJpIh9SgUodRR4/fXlQ1SCcc91XaDDcmLKY27TVPzDqIE08MVnqCKYQjCrqnhmzkiFcs3KV0hA==", - "requires": { - "@aws-amplify/auth": "3.4.30", - "@aws-amplify/cache": "3.1.55", - "@aws-amplify/core": "3.8.22", - "graphql": "14.0.0", - "paho-mqtt": "^1.1.0", - "uuid": "^3.2.1", - "zen-observable-ts": "0.8.19" + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "@aws-amplify/storage": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-3.4.0.tgz", - "integrity": "sha512-76SzmtbTAQo/CZgzJKe9O/DwSyi2JVG8LAwau57wK/8Sn8QHwpycf1QI6BEedFcaopvtVqPWumzmLoWzL9kLjA==", - "requires": { - "@aws-amplify/core": "3.8.22", - "@aws-sdk/client-s3": "3.6.1", - "@aws-sdk/s3-request-presigner": "3.6.1", - "@aws-sdk/util-create-request": "3.6.1", - "@aws-sdk/util-format-url": "3.6.1", - "axios": "0.21.1", - "events": "^3.1.0", - "sinon": "^7.5.0" - }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "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": { - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "requires": { - "follow-redirects": "^1.10.0" - } - } + "unique-slug": "^2.0.0" } }, - "@aws-amplify/ui": { + "node_modules/unique-slug": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@aws-amplify/ui/-/ui-2.0.2.tgz", - "integrity": "sha512-OLdZmUCVK29+JV8PrkgVPjg+GIFtBnNjhC0JSRgrps+ynOFkibMQQPKeFXlTYtlukuCuepCelPSkjxvhcLq2ZA==" + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } }, - "@aws-amplify/xr": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@aws-amplify/xr/-/xr-2.2.30.tgz", - "integrity": "sha512-BzfpLoiucYR4YoJIctFBoRefwcx77GKCOf5Pas8LnVIVvizozv1FIZZ3FE2lhNqd3fvd2+e1ogh/Y+chohDTGQ==", - "requires": { - "@aws-amplify/core": "3.8.22" + "node_modules/universal-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", + "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", + "dependencies": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" } }, - "@aws-crypto/crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-1.0.0.tgz", - "integrity": "sha512-wr4EyCv3ZfLH3Sg7FErV6e/cLhpk9rUP/l5322y8PRgpQsItdieaLbtE4aDOR+dxl8U7BG9FIwWXH4TleTDZ9A==", - "requires": { - "tslib": "^1.11.1" + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true, + "engines": { + "node": ">= 4.0.0" } }, - "@aws-crypto/ie11-detection": { + "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", - "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", - "requires": { - "tslib": "^1.11.1" + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" } }, - "@aws-crypto/sha256-browser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.1.0.tgz", - "integrity": "sha512-VIpuLRDonMAHgomrsm/zKbeXTnxpr4aHDQmS4pF+NcpvBp64l675yjGA9hyUYs/QJwBjUl8WqMjh9tIRgi85Sg==", - "requires": { - "@aws-crypto/ie11-detection": "^1.0.0", - "@aws-crypto/sha256-js": "^1.1.0", - "@aws-crypto/supports-web-crypto": "^1.0.0", - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", - "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", - "requires": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - } + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@aws-crypto/sha256-js": { - "version": "1.0.0-alpha.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.0.0-alpha.0.tgz", - "integrity": "sha512-GidX2lccEtHZw8mXDKJQj6tea7qh3pAnsNSp1eZNxsN4MMu2OvSraPSqiB1EihsQkZBMg0IiZPpZHoACUX/QMQ==", - "requires": { - "@aws-sdk/types": "^1.0.0-alpha.0", - "@aws-sdk/util-utf8-browser": "^1.0.0-alpha.0", - "tslib": "^1.9.3" + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dependencies": { - "@aws-sdk/types": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-1.0.0-rc.10.tgz", - "integrity": "sha512-9gwhYnkTNuYZ+etCtM4T8gjpZ0SWSXbzQxY34UjSS+dt3C/UnbX0J22tMahp/9Z1yCa9pihtXrkD+nO2xn7nVQ==" - }, - "@aws-sdk/util-utf8-browser": { - "version": "1.0.0-rc.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-1.0.0-rc.8.tgz", - "integrity": "sha512-clncPMJ23rxCIkZ9LoUC8SowwZGxWyN2TwRb0XvW/Cv9EavkRgRCOrCpneGyC326lqtMKx36onnpaSRHxErUYw==", - "requires": { - "tslib": "^1.8.0" - } - } + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@aws-crypto/supports-web-crypto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", - "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", - "requires": { - "tslib": "^1.11.1" + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" } }, - "@aws-sdk/abort-controller": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.6.1.tgz", - "integrity": "sha512-X81XkxX/2Tvv9YNcEto/rcQzPIdKJHFSnl9hBl/qkSdCFV/GaQ2XNWfKm5qFXMLlZNFS0Fn5CnBJ83qnBm47vg==", - "requires": { - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" } }, - "@aws-sdk/chunked-blob-reader": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.6.1.tgz", - "integrity": "sha512-QBGUBoD8D5nsM/EKoc0rjpApa5NE5pQVzw1caE8sG00QMMPkCXWSB/gTVKVY0GOAhJFoA/VpVPQchIlZcOrBFg==", - "requires": { - "tslib": "^1.8.0" + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "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" } }, - "@aws-sdk/chunked-blob-reader-native": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.6.1.tgz", - "integrity": "sha512-vP6bc2v9h442Srmo7t2QcIbPjk5IqLSf4jGnKDAes8z+7eyjCtKugRP3lOM1fJCfGlPIsJGYnexxYdEGw008vA==", - "requires": { - "@aws-sdk/util-base64-browser": "3.6.1", - "tslib": "^1.8.0" + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" } }, - "@aws-sdk/client-cognito-identity": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.6.1.tgz", - "integrity": "sha512-FMj2GR9R5oCKb3/NI16GIvWeHcE4uX42fBAaQKPbjg2gALFDx9CcJYsdOtDP37V89GtPyZilLv6GJxrwJKzYGg==", - "requires": { - "@aws-crypto/sha256-browser": "^1.0.0", - "@aws-crypto/sha256-js": "^1.0.0", - "@aws-sdk/config-resolver": "3.6.1", - "@aws-sdk/credential-provider-node": "3.6.1", - "@aws-sdk/fetch-http-handler": "3.6.1", - "@aws-sdk/hash-node": "3.6.1", - "@aws-sdk/invalid-dependency": "3.6.1", - "@aws-sdk/middleware-content-length": "3.6.1", - "@aws-sdk/middleware-host-header": "3.6.1", - "@aws-sdk/middleware-logger": "3.6.1", - "@aws-sdk/middleware-retry": "3.6.1", - "@aws-sdk/middleware-serde": "3.6.1", - "@aws-sdk/middleware-signing": "3.6.1", - "@aws-sdk/middleware-stack": "3.6.1", - "@aws-sdk/middleware-user-agent": "3.6.1", - "@aws-sdk/node-config-provider": "3.6.1", - "@aws-sdk/node-http-handler": "3.6.1", - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/smithy-client": "3.6.1", - "@aws-sdk/types": "3.6.1", - "@aws-sdk/url-parser": "3.6.1", - "@aws-sdk/url-parser-native": "3.6.1", - "@aws-sdk/util-base64-browser": "3.6.1", - "@aws-sdk/util-base64-node": "3.6.1", - "@aws-sdk/util-body-length-browser": "3.6.1", - "@aws-sdk/util-body-length-node": "3.6.1", - "@aws-sdk/util-user-agent-browser": "3.6.1", - "@aws-sdk/util-user-agent-node": "3.6.1", - "@aws-sdk/util-utf8-browser": "3.6.1", - "@aws-sdk/util-utf8-node": "3.6.1", - "tslib": "^2.0.0" + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-subscription": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", + "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", + "peer": true, + "dependencies": { + "object-assign": "^4.1.1" }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", - "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", - "requires": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } + "inherits": "2.0.3" } }, - "@aws-sdk/client-comprehend": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-comprehend/-/client-comprehend-3.6.1.tgz", - "integrity": "sha512-Y2ixlSTjjAp2HJhkUArtYqC/X+zG5Qqu3Bl+Ez22u4u4YnG8HsNFD6FE1axuWSdSa5AFtWTEt+Cz2Ghj/tDySA==", - "requires": { - "@aws-crypto/sha256-browser": "^1.0.0", - "@aws-crypto/sha256-js": "^1.0.0", - "@aws-sdk/config-resolver": "3.6.1", - "@aws-sdk/credential-provider-node": "3.6.1", - "@aws-sdk/fetch-http-handler": "3.6.1", - "@aws-sdk/hash-node": "3.6.1", - "@aws-sdk/invalid-dependency": "3.6.1", - "@aws-sdk/middleware-content-length": "3.6.1", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/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/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "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=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/validate.js": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz", + "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==" + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "peer": true + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "peer": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/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, + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/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, + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.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=", + "peer": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "4.x.x" + } + }, + "node_modules/webpack-cli/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "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/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", + "peer": true + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xcode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", + "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", + "peer": true, + "dependencies": { + "simple-plist": "^1.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "peer": true, + "dependencies": { + "sax": "^1.2.1" + } + }, + "node_modules/xmldom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", + "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "node_modules/zen-observable-ts": { + "version": "0.8.19", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.19.tgz", + "integrity": "sha512-u1a2rpE13G+jSzrg3aiCqXU5tN2kw41b+cBZGmnc+30YimdkKiDj9bTowcB41eL77/17RF/h+393AuVgShyheQ==", + "dependencies": { + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + } + }, + "node_modules/zen-push": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/zen-push/-/zen-push-0.2.1.tgz", + "integrity": "sha512-Qv4qvc8ZIue51B/0zmeIMxpIGDVhz4GhJALBvnKs/FRa2T7jy4Ori9wFwaHVt0zWV7MIFglKAHbgnVxVTw7U1w==", + "dependencies": { + "zen-observable": "^0.7.0" + } + }, + "node_modules/zen-push/node_modules/zen-observable": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.7.1.tgz", + "integrity": "sha512-OI6VMSe0yeqaouIXtedC+F55Sr6r9ppS7+wTbSexkYdHbdt4ctTuPNXP/rwm7GTVI63YBc+EBT0b0tl7YnJLRg==" + } + }, + "dependencies": { + "@aws-amplify/analytics": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@aws-amplify/analytics/-/analytics-4.0.18.tgz", + "integrity": "sha512-nOwpubv0jGOo0IhzHKIui0kiAEQoZ+PchBv47D4yCffV2pYiMua6NllFsAmxkHLD8EYTg3MYe932HNmM6+gSzg==", + "requires": { + "@aws-amplify/cache": "3.1.55", + "@aws-amplify/core": "3.8.22", + "@aws-sdk/client-firehose": "3.6.1", + "@aws-sdk/client-kinesis": "3.6.1", + "@aws-sdk/client-personalize-events": "3.6.1", + "@aws-sdk/client-pinpoint": "3.6.1", + "@aws-sdk/util-utf8-browser": "3.6.1", + "lodash": "^4.17.20", + "uuid": "^3.2.1" + } + }, + "@aws-amplify/api": { + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@aws-amplify/api/-/api-3.2.30.tgz", + "integrity": "sha512-3nTDDNMuWA81kAUc+2eV7aMJSYdWR7z4CtvMB7UGcfiKlXjyCZdXahbYLqyn3UGvNoGkoITD2J7jZ9Rc4ndXJQ==", + "requires": { + "@aws-amplify/api-graphql": "1.2.30", + "@aws-amplify/api-rest": "1.2.30" + } + }, + "@aws-amplify/api-graphql": { + "version": "1.2.30", + "resolved": "https://registry.npmjs.org/@aws-amplify/api-graphql/-/api-graphql-1.2.30.tgz", + "integrity": "sha512-qbkgKu8e0DD0ZXtMQ5b3uVJlqlC8EeEwhs3zy/BEKz51dUFDI5p6KMUYjbYVw8oNAgsFBXkMGCkhY+etXJNc6w==", + "requires": { + "@aws-amplify/api-rest": "1.2.30", + "@aws-amplify/auth": "3.4.30", + "@aws-amplify/cache": "3.1.55", + "@aws-amplify/core": "3.8.22", + "@aws-amplify/pubsub": "3.2.28", + "graphql": "14.0.0", + "uuid": "^3.2.1", + "zen-observable-ts": "0.8.19" + } + }, + "@aws-amplify/api-rest": { + "version": "1.2.30", + "resolved": "https://registry.npmjs.org/@aws-amplify/api-rest/-/api-rest-1.2.30.tgz", + "integrity": "sha512-mvcQ+u+j9dv1v2rSMZ2I31sSimIAi45UXmOTAUAjHEac/u8OYlUyLKG2DcTs1QmFKxNL0CHWqi060amjIIhfYg==", + "requires": { + "@aws-amplify/core": "3.8.22", + "axios": "0.21.1" + }, + "dependencies": { + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + } + } + }, + "@aws-amplify/auth": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@aws-amplify/auth/-/auth-3.4.30.tgz", + "integrity": "sha512-DYBDKU8JGZB8LRSVUj3BUKU/4qOcWkjfYoaVr3T3fvJvE2n2YOcXBVsYXUq24q1UlAuTfIbZQCrsbL7kBAxtAg==", + "requires": { + "@aws-amplify/cache": "3.1.55", + "@aws-amplify/core": "3.8.22", + "amazon-cognito-identity-js": "4.6.0", + "crypto-js": "^3.3.0" + } + }, + "@aws-amplify/cache": { + "version": "3.1.55", + "resolved": "https://registry.npmjs.org/@aws-amplify/cache/-/cache-3.1.55.tgz", + "integrity": "sha512-3txk5bmC9wtijTaeKoAsype2rZiCfmYk6s8f5oiPo+dIU4a1mIliSHd8IAduKdOIbGdvJbzkzlplqXDQGJD+ng==", + "requires": { + "@aws-amplify/core": "3.8.22" + } + }, + "@aws-amplify/core": { + "version": "3.8.22", + "resolved": "https://registry.npmjs.org/@aws-amplify/core/-/core-3.8.22.tgz", + "integrity": "sha512-Plw0Gr6ik223bjBch/YicIUAhYTIEc8W3hx52u8jawpGMi1bcwmNAiuMMBvlSl50edbhmPgIw24GtyZNHLYDgQ==", + "requires": { + "@aws-crypto/sha256-js": "1.0.0-alpha.0", + "@aws-sdk/client-cognito-identity": "3.6.1", + "@aws-sdk/credential-provider-cognito-identity": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-hex-encoding": "3.6.1", + "universal-cookie": "^4.0.4", + "zen-observable-ts": "0.8.19" + } + }, + "@aws-amplify/datastore": { + "version": "2.9.16", + "resolved": "https://registry.npmjs.org/@aws-amplify/datastore/-/datastore-2.9.16.tgz", + "integrity": "sha512-YCJryQdpqVNF4S2dxkm46PoZ46rW0IJAcb2jHQuuUKa8lFXA5a2q4/cT8pakCGgVjmdaJXNUWlAZQu0CHapgRg==", + "requires": { + "@aws-amplify/api": "3.2.30", + "@aws-amplify/core": "3.8.22", + "@aws-amplify/pubsub": "3.2.28", + "idb": "5.0.6", + "immer": "8.0.1", + "ulid": "2.3.0", + "uuid": "3.3.2", + "zen-observable-ts": "0.8.19", + "zen-push": "0.2.1" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "@aws-amplify/interactions": { + "version": "3.3.30", + "resolved": "https://registry.npmjs.org/@aws-amplify/interactions/-/interactions-3.3.30.tgz", + "integrity": "sha512-RFDU+pptmxR+cPD4JlFz5JMFG5wIbY1M8PIpzOEhWPf1cnpSAVeDq9zvXDnyir45UrLfHxvJ8I3ocAZeAEa51g==", + "requires": { + "@aws-amplify/core": "3.8.22", + "@aws-sdk/client-lex-runtime-service": "3.6.1" + } + }, + "@aws-amplify/predictions": { + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@aws-amplify/predictions/-/predictions-3.2.30.tgz", + "integrity": "sha512-dFv+FC4F/+RiX4m9/+SGWG4UHsssZiHTdrUxjHyXi2/9csFieG4GS78lhcEnk1/k4LGYvYwU0qtMwzO5tcZH4g==", + "requires": { + "@aws-amplify/core": "3.8.22", + "@aws-amplify/storage": "3.4.0", + "@aws-sdk/client-comprehend": "3.6.1", + "@aws-sdk/client-polly": "3.6.1", + "@aws-sdk/client-rekognition": "3.6.1", + "@aws-sdk/client-textract": "3.6.1", + "@aws-sdk/client-translate": "3.6.1", + "@aws-sdk/eventstream-marshaller": "3.6.1", + "@aws-sdk/util-utf8-node": "3.6.1", + "uuid": "^3.2.1" + } + }, + "@aws-amplify/pubsub": { + "version": "3.2.28", + "resolved": "https://registry.npmjs.org/@aws-amplify/pubsub/-/pubsub-3.2.28.tgz", + "integrity": "sha512-fsOHrs+EfKZDcJpIh9SgUodRR4/fXlQ1SCcc91XaDDcmLKY27TVPzDqIE08MVnqCKYQjCrqnhmzkiFcs3KV0hA==", + "requires": { + "@aws-amplify/auth": "3.4.30", + "@aws-amplify/cache": "3.1.55", + "@aws-amplify/core": "3.8.22", + "graphql": "14.0.0", + "paho-mqtt": "^1.1.0", + "uuid": "^3.2.1", + "zen-observable-ts": "0.8.19" + } + }, + "@aws-amplify/storage": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-3.4.0.tgz", + "integrity": "sha512-76SzmtbTAQo/CZgzJKe9O/DwSyi2JVG8LAwau57wK/8Sn8QHwpycf1QI6BEedFcaopvtVqPWumzmLoWzL9kLjA==", + "requires": { + "@aws-amplify/core": "3.8.22", + "@aws-sdk/client-s3": "3.6.1", + "@aws-sdk/s3-request-presigner": "3.6.1", + "@aws-sdk/util-create-request": "3.6.1", + "@aws-sdk/util-format-url": "3.6.1", + "axios": "0.21.1", + "events": "^3.1.0", + "sinon": "^7.5.0" + }, + "dependencies": { + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + } + } + }, + "@aws-amplify/ui": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-amplify/ui/-/ui-2.0.2.tgz", + "integrity": "sha512-OLdZmUCVK29+JV8PrkgVPjg+GIFtBnNjhC0JSRgrps+ynOFkibMQQPKeFXlTYtlukuCuepCelPSkjxvhcLq2ZA==" + }, + "@aws-amplify/xr": { + "version": "2.2.30", + "resolved": "https://registry.npmjs.org/@aws-amplify/xr/-/xr-2.2.30.tgz", + "integrity": "sha512-BzfpLoiucYR4YoJIctFBoRefwcx77GKCOf5Pas8LnVIVvizozv1FIZZ3FE2lhNqd3fvd2+e1ogh/Y+chohDTGQ==", + "requires": { + "@aws-amplify/core": "3.8.22" + } + }, + "@aws-crypto/crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-1.0.0.tgz", + "integrity": "sha512-wr4EyCv3ZfLH3Sg7FErV6e/cLhpk9rUP/l5322y8PRgpQsItdieaLbtE4aDOR+dxl8U7BG9FIwWXH4TleTDZ9A==", + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/ie11-detection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", + "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha256-browser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.1.0.tgz", + "integrity": "sha512-VIpuLRDonMAHgomrsm/zKbeXTnxpr4aHDQmS4pF+NcpvBp64l675yjGA9hyUYs/QJwBjUl8WqMjh9tIRgi85Sg==", + "requires": { + "@aws-crypto/ie11-detection": "^1.0.0", + "@aws-crypto/sha256-js": "^1.1.0", + "@aws-crypto/supports-web-crypto": "^1.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + } + } + }, + "@aws-crypto/sha256-js": { + "version": "1.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.0.0-alpha.0.tgz", + "integrity": "sha512-GidX2lccEtHZw8mXDKJQj6tea7qh3pAnsNSp1eZNxsN4MMu2OvSraPSqiB1EihsQkZBMg0IiZPpZHoACUX/QMQ==", + "requires": { + "@aws-sdk/types": "^1.0.0-alpha.0", + "@aws-sdk/util-utf8-browser": "^1.0.0-alpha.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@aws-sdk/types": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-1.0.0-rc.10.tgz", + "integrity": "sha512-9gwhYnkTNuYZ+etCtM4T8gjpZ0SWSXbzQxY34UjSS+dt3C/UnbX0J22tMahp/9Z1yCa9pihtXrkD+nO2xn7nVQ==" + }, + "@aws-sdk/util-utf8-browser": { + "version": "1.0.0-rc.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-1.0.0-rc.8.tgz", + "integrity": "sha512-clncPMJ23rxCIkZ9LoUC8SowwZGxWyN2TwRb0XvW/Cv9EavkRgRCOrCpneGyC326lqtMKx36onnpaSRHxErUYw==", + "requires": { + "tslib": "^1.8.0" + } + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", + "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-sdk/abort-controller": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.6.1.tgz", + "integrity": "sha512-X81XkxX/2Tvv9YNcEto/rcQzPIdKJHFSnl9hBl/qkSdCFV/GaQ2XNWfKm5qFXMLlZNFS0Fn5CnBJ83qnBm47vg==", + "requires": { + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/chunked-blob-reader": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.6.1.tgz", + "integrity": "sha512-QBGUBoD8D5nsM/EKoc0rjpApa5NE5pQVzw1caE8sG00QMMPkCXWSB/gTVKVY0GOAhJFoA/VpVPQchIlZcOrBFg==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/chunked-blob-reader-native": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.6.1.tgz", + "integrity": "sha512-vP6bc2v9h442Srmo7t2QcIbPjk5IqLSf4jGnKDAes8z+7eyjCtKugRP3lOM1fJCfGlPIsJGYnexxYdEGw008vA==", + "requires": { + "@aws-sdk/util-base64-browser": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.6.1.tgz", + "integrity": "sha512-FMj2GR9R5oCKb3/NI16GIvWeHcE4uX42fBAaQKPbjg2gALFDx9CcJYsdOtDP37V89GtPyZilLv6GJxrwJKzYGg==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.6.1", + "@aws-sdk/credential-provider-node": "3.6.1", + "@aws-sdk/fetch-http-handler": "3.6.1", + "@aws-sdk/hash-node": "3.6.1", + "@aws-sdk/invalid-dependency": "3.6.1", + "@aws-sdk/middleware-content-length": "3.6.1", + "@aws-sdk/middleware-host-header": "3.6.1", + "@aws-sdk/middleware-logger": "3.6.1", + "@aws-sdk/middleware-retry": "3.6.1", + "@aws-sdk/middleware-serde": "3.6.1", + "@aws-sdk/middleware-signing": "3.6.1", + "@aws-sdk/middleware-stack": "3.6.1", + "@aws-sdk/middleware-user-agent": "3.6.1", + "@aws-sdk/node-config-provider": "3.6.1", + "@aws-sdk/node-http-handler": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/smithy-client": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/url-parser": "3.6.1", + "@aws-sdk/url-parser-native": "3.6.1", + "@aws-sdk/util-base64-browser": "3.6.1", + "@aws-sdk/util-base64-node": "3.6.1", + "@aws-sdk/util-body-length-browser": "3.6.1", + "@aws-sdk/util-body-length-node": "3.6.1", + "@aws-sdk/util-user-agent-browser": "3.6.1", + "@aws-sdk/util-user-agent-node": "3.6.1", + "@aws-sdk/util-utf8-browser": "3.6.1", + "@aws-sdk/util-utf8-node": "3.6.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@aws-sdk/client-comprehend": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-comprehend/-/client-comprehend-3.6.1.tgz", + "integrity": "sha512-Y2ixlSTjjAp2HJhkUArtYqC/X+zG5Qqu3Bl+Ez22u4u4YnG8HsNFD6FE1axuWSdSa5AFtWTEt+Cz2Ghj/tDySA==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.6.1", + "@aws-sdk/credential-provider-node": "3.6.1", + "@aws-sdk/fetch-http-handler": "3.6.1", + "@aws-sdk/hash-node": "3.6.1", + "@aws-sdk/invalid-dependency": "3.6.1", + "@aws-sdk/middleware-content-length": "3.6.1", + "@aws-sdk/middleware-host-header": "3.6.1", + "@aws-sdk/middleware-logger": "3.6.1", + "@aws-sdk/middleware-retry": "3.6.1", + "@aws-sdk/middleware-serde": "3.6.1", + "@aws-sdk/middleware-signing": "3.6.1", + "@aws-sdk/middleware-stack": "3.6.1", + "@aws-sdk/middleware-user-agent": "3.6.1", + "@aws-sdk/node-config-provider": "3.6.1", + "@aws-sdk/node-http-handler": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/smithy-client": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/url-parser": "3.6.1", + "@aws-sdk/url-parser-native": "3.6.1", + "@aws-sdk/util-base64-browser": "3.6.1", + "@aws-sdk/util-base64-node": "3.6.1", + "@aws-sdk/util-body-length-browser": "3.6.1", + "@aws-sdk/util-body-length-node": "3.6.1", + "@aws-sdk/util-user-agent-browser": "3.6.1", + "@aws-sdk/util-user-agent-node": "3.6.1", + "@aws-sdk/util-utf8-browser": "3.6.1", + "@aws-sdk/util-utf8-node": "3.6.1", + "tslib": "^2.0.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@aws-sdk/client-firehose": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-firehose/-/client-firehose-3.6.1.tgz", + "integrity": "sha512-KhiKCm+cJmnRFuAEyO3DBpFVDNix1XcVikdxk2lvYbFWkM1oUZoBpudxaJ+fPf2W3stF3CXIAOP+TnGqSZCy9g==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.6.1", + "@aws-sdk/credential-provider-node": "3.6.1", + "@aws-sdk/fetch-http-handler": "3.6.1", + "@aws-sdk/hash-node": "3.6.1", + "@aws-sdk/invalid-dependency": "3.6.1", + "@aws-sdk/middleware-content-length": "3.6.1", + "@aws-sdk/middleware-host-header": "3.6.1", + "@aws-sdk/middleware-logger": "3.6.1", + "@aws-sdk/middleware-retry": "3.6.1", + "@aws-sdk/middleware-serde": "3.6.1", + "@aws-sdk/middleware-signing": "3.6.1", + "@aws-sdk/middleware-stack": "3.6.1", + "@aws-sdk/middleware-user-agent": "3.6.1", + "@aws-sdk/node-config-provider": "3.6.1", + "@aws-sdk/node-http-handler": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/smithy-client": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/url-parser": "3.6.1", + "@aws-sdk/url-parser-native": "3.6.1", + "@aws-sdk/util-base64-browser": "3.6.1", + "@aws-sdk/util-base64-node": "3.6.1", + "@aws-sdk/util-body-length-browser": "3.6.1", + "@aws-sdk/util-body-length-node": "3.6.1", + "@aws-sdk/util-user-agent-browser": "3.6.1", + "@aws-sdk/util-user-agent-node": "3.6.1", + "@aws-sdk/util-utf8-browser": "3.6.1", + "@aws-sdk/util-utf8-node": "3.6.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@aws-sdk/client-kinesis": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.6.1.tgz", + "integrity": "sha512-Ygo+92LxHeUZmiyhiHT+k7hIOhJd6S7ckCEVUsQs2rfwe9bAygUY/3cCoZSqgWy7exFRRKsjhzStcyV6i6jrVQ==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.6.1", + "@aws-sdk/credential-provider-node": "3.6.1", + "@aws-sdk/eventstream-serde-browser": "3.6.1", + "@aws-sdk/eventstream-serde-config-resolver": "3.6.1", + "@aws-sdk/eventstream-serde-node": "3.6.1", + "@aws-sdk/fetch-http-handler": "3.6.1", + "@aws-sdk/hash-node": "3.6.1", + "@aws-sdk/invalid-dependency": "3.6.1", + "@aws-sdk/middleware-content-length": "3.6.1", "@aws-sdk/middleware-host-header": "3.6.1", "@aws-sdk/middleware-logger": "3.6.1", "@aws-sdk/middleware-retry": "3.6.1", @@ -16246,8 +18440,8 @@ "@aws-sdk/util-user-agent-node": "3.6.1", "@aws-sdk/util-utf8-browser": "3.6.1", "@aws-sdk/util-utf8-node": "3.6.1", - "tslib": "^2.0.0", - "uuid": "^3.0.0" + "@aws-sdk/util-waiter": "3.6.1", + "tslib": "^2.0.0" }, "dependencies": { "@aws-crypto/sha256-js": { @@ -16274,10 +18468,10 @@ } } }, - "@aws-sdk/client-firehose": { + "@aws-sdk/client-lex-runtime-service": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-firehose/-/client-firehose-3.6.1.tgz", - "integrity": "sha512-KhiKCm+cJmnRFuAEyO3DBpFVDNix1XcVikdxk2lvYbFWkM1oUZoBpudxaJ+fPf2W3stF3CXIAOP+TnGqSZCy9g==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lex-runtime-service/-/client-lex-runtime-service-3.6.1.tgz", + "integrity": "sha512-xi3m3f3G9KEKdziOFyynkfvN7OzdT9T8V3wkM4x+Zhid9v1K4Rg7OvbBb5oG9UicLz54tcZGkt0VN4ldEB/XLQ==", "requires": { "@aws-crypto/sha256-browser": "^1.0.0", "@aws-crypto/sha256-js": "^1.0.0", @@ -16336,18 +18530,15 @@ } } }, - "@aws-sdk/client-kinesis": { + "@aws-sdk/client-personalize-events": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.6.1.tgz", - "integrity": "sha512-Ygo+92LxHeUZmiyhiHT+k7hIOhJd6S7ckCEVUsQs2rfwe9bAygUY/3cCoZSqgWy7exFRRKsjhzStcyV6i6jrVQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-personalize-events/-/client-personalize-events-3.6.1.tgz", + "integrity": "sha512-x9Jl/7emSQsB6GwBvjyw5BiSO26CnH4uvjNit6n54yNMtJ26q0+oIxkplnUDyjLTfLRe373c/z5/4dQQtDffkw==", "requires": { "@aws-crypto/sha256-browser": "^1.0.0", "@aws-crypto/sha256-js": "^1.0.0", "@aws-sdk/config-resolver": "3.6.1", "@aws-sdk/credential-provider-node": "3.6.1", - "@aws-sdk/eventstream-serde-browser": "3.6.1", - "@aws-sdk/eventstream-serde-config-resolver": "3.6.1", - "@aws-sdk/eventstream-serde-node": "3.6.1", "@aws-sdk/fetch-http-handler": "3.6.1", "@aws-sdk/hash-node": "3.6.1", "@aws-sdk/invalid-dependency": "3.6.1", @@ -16374,7 +18565,6 @@ "@aws-sdk/util-user-agent-node": "3.6.1", "@aws-sdk/util-utf8-browser": "3.6.1", "@aws-sdk/util-utf8-node": "3.6.1", - "@aws-sdk/util-waiter": "3.6.1", "tslib": "^2.0.0" }, "dependencies": { @@ -16402,24 +18592,223 @@ } } }, - "@aws-sdk/client-lex-runtime-service": { + "@aws-sdk/client-pinpoint": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lex-runtime-service/-/client-lex-runtime-service-3.6.1.tgz", - "integrity": "sha512-xi3m3f3G9KEKdziOFyynkfvN7OzdT9T8V3wkM4x+Zhid9v1K4Rg7OvbBb5oG9UicLz54tcZGkt0VN4ldEB/XLQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-pinpoint/-/client-pinpoint-3.6.1.tgz", + "integrity": "sha512-dueBedp91EKAHxcWLR3aNx/eUEdxdF9niEQTzOO2O4iJL2yvO2Hh7ZYiO7B3g7FuuICTpWSHd//Y9mGmSVLMCg==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.6.1", + "@aws-sdk/credential-provider-node": "3.6.1", + "@aws-sdk/fetch-http-handler": "3.6.1", + "@aws-sdk/hash-node": "3.6.1", + "@aws-sdk/invalid-dependency": "3.6.1", + "@aws-sdk/middleware-content-length": "3.6.1", + "@aws-sdk/middleware-host-header": "3.6.1", + "@aws-sdk/middleware-logger": "3.6.1", + "@aws-sdk/middleware-retry": "3.6.1", + "@aws-sdk/middleware-serde": "3.6.1", + "@aws-sdk/middleware-signing": "3.6.1", + "@aws-sdk/middleware-stack": "3.6.1", + "@aws-sdk/middleware-user-agent": "3.6.1", + "@aws-sdk/node-config-provider": "3.6.1", + "@aws-sdk/node-http-handler": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/smithy-client": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/url-parser": "3.6.1", + "@aws-sdk/url-parser-native": "3.6.1", + "@aws-sdk/util-base64-browser": "3.6.1", + "@aws-sdk/util-base64-node": "3.6.1", + "@aws-sdk/util-body-length-browser": "3.6.1", + "@aws-sdk/util-body-length-node": "3.6.1", + "@aws-sdk/util-user-agent-browser": "3.6.1", + "@aws-sdk/util-user-agent-node": "3.6.1", + "@aws-sdk/util-utf8-browser": "3.6.1", + "@aws-sdk/util-utf8-node": "3.6.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@aws-sdk/client-polly": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-polly/-/client-polly-3.6.1.tgz", + "integrity": "sha512-y6fxVYndGS7z2KqHViPCqagBEOsZlxBUYUJZuD6WWTiQrI0Pwe5qG02oKJVaa5OmxE20QLf6bRBWj2rQpeF4IQ==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.6.1", + "@aws-sdk/credential-provider-node": "3.6.1", + "@aws-sdk/fetch-http-handler": "3.6.1", + "@aws-sdk/hash-node": "3.6.1", + "@aws-sdk/invalid-dependency": "3.6.1", + "@aws-sdk/middleware-content-length": "3.6.1", + "@aws-sdk/middleware-host-header": "3.6.1", + "@aws-sdk/middleware-logger": "3.6.1", + "@aws-sdk/middleware-retry": "3.6.1", + "@aws-sdk/middleware-serde": "3.6.1", + "@aws-sdk/middleware-signing": "3.6.1", + "@aws-sdk/middleware-stack": "3.6.1", + "@aws-sdk/middleware-user-agent": "3.6.1", + "@aws-sdk/node-config-provider": "3.6.1", + "@aws-sdk/node-http-handler": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/smithy-client": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/url-parser": "3.6.1", + "@aws-sdk/url-parser-native": "3.6.1", + "@aws-sdk/util-base64-browser": "3.6.1", + "@aws-sdk/util-base64-node": "3.6.1", + "@aws-sdk/util-body-length-browser": "3.6.1", + "@aws-sdk/util-body-length-node": "3.6.1", + "@aws-sdk/util-user-agent-browser": "3.6.1", + "@aws-sdk/util-user-agent-node": "3.6.1", + "@aws-sdk/util-utf8-browser": "3.6.1", + "@aws-sdk/util-utf8-node": "3.6.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@aws-sdk/client-rekognition": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-rekognition/-/client-rekognition-3.6.1.tgz", + "integrity": "sha512-Ia4FEog9RrI0IoDRbOJO6djwhVAAaEZutxEKrWbjrVz4bgib28L+V+yAio2SUneeirj8pNYXwBKPfoYOUqGHhA==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.6.1", + "@aws-sdk/credential-provider-node": "3.6.1", + "@aws-sdk/fetch-http-handler": "3.6.1", + "@aws-sdk/hash-node": "3.6.1", + "@aws-sdk/invalid-dependency": "3.6.1", + "@aws-sdk/middleware-content-length": "3.6.1", + "@aws-sdk/middleware-host-header": "3.6.1", + "@aws-sdk/middleware-logger": "3.6.1", + "@aws-sdk/middleware-retry": "3.6.1", + "@aws-sdk/middleware-serde": "3.6.1", + "@aws-sdk/middleware-signing": "3.6.1", + "@aws-sdk/middleware-stack": "3.6.1", + "@aws-sdk/middleware-user-agent": "3.6.1", + "@aws-sdk/node-config-provider": "3.6.1", + "@aws-sdk/node-http-handler": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/smithy-client": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/url-parser": "3.6.1", + "@aws-sdk/url-parser-native": "3.6.1", + "@aws-sdk/util-base64-browser": "3.6.1", + "@aws-sdk/util-base64-node": "3.6.1", + "@aws-sdk/util-body-length-browser": "3.6.1", + "@aws-sdk/util-body-length-node": "3.6.1", + "@aws-sdk/util-user-agent-browser": "3.6.1", + "@aws-sdk/util-user-agent-node": "3.6.1", + "@aws-sdk/util-utf8-browser": "3.6.1", + "@aws-sdk/util-utf8-node": "3.6.1", + "@aws-sdk/util-waiter": "3.6.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@aws-sdk/client-s3": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.6.1.tgz", + "integrity": "sha512-59cTmZj92iwgNoAeJirK5sZNQNXLc/oI3luqrEHRNLuOh70bjdgad70T0a5k2Ysd/v/QNamqJxnCJMPuX1bhgw==", "requires": { "@aws-crypto/sha256-browser": "^1.0.0", "@aws-crypto/sha256-js": "^1.0.0", "@aws-sdk/config-resolver": "3.6.1", "@aws-sdk/credential-provider-node": "3.6.1", + "@aws-sdk/eventstream-serde-browser": "3.6.1", + "@aws-sdk/eventstream-serde-config-resolver": "3.6.1", + "@aws-sdk/eventstream-serde-node": "3.6.1", "@aws-sdk/fetch-http-handler": "3.6.1", + "@aws-sdk/hash-blob-browser": "3.6.1", "@aws-sdk/hash-node": "3.6.1", + "@aws-sdk/hash-stream-node": "3.6.1", "@aws-sdk/invalid-dependency": "3.6.1", + "@aws-sdk/md5-js": "3.6.1", + "@aws-sdk/middleware-apply-body-checksum": "3.6.1", + "@aws-sdk/middleware-bucket-endpoint": "3.6.1", "@aws-sdk/middleware-content-length": "3.6.1", + "@aws-sdk/middleware-expect-continue": "3.6.1", "@aws-sdk/middleware-host-header": "3.6.1", + "@aws-sdk/middleware-location-constraint": "3.6.1", "@aws-sdk/middleware-logger": "3.6.1", "@aws-sdk/middleware-retry": "3.6.1", + "@aws-sdk/middleware-sdk-s3": "3.6.1", "@aws-sdk/middleware-serde": "3.6.1", "@aws-sdk/middleware-signing": "3.6.1", + "@aws-sdk/middleware-ssec": "3.6.1", "@aws-sdk/middleware-stack": "3.6.1", "@aws-sdk/middleware-user-agent": "3.6.1", "@aws-sdk/node-config-provider": "3.6.1", @@ -16437,6 +18826,9 @@ "@aws-sdk/util-user-agent-node": "3.6.1", "@aws-sdk/util-utf8-browser": "3.6.1", "@aws-sdk/util-utf8-node": "3.6.1", + "@aws-sdk/util-waiter": "3.6.1", + "@aws-sdk/xml-builder": "3.6.1", + "fast-xml-parser": "^3.16.0", "tslib": "^2.0.0" }, "dependencies": { @@ -16464,10 +18856,10 @@ } } }, - "@aws-sdk/client-personalize-events": { + "@aws-sdk/client-textract": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-personalize-events/-/client-personalize-events-3.6.1.tgz", - "integrity": "sha512-x9Jl/7emSQsB6GwBvjyw5BiSO26CnH4uvjNit6n54yNMtJ26q0+oIxkplnUDyjLTfLRe373c/z5/4dQQtDffkw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-textract/-/client-textract-3.6.1.tgz", + "integrity": "sha512-nLrBzWDt3ToiGVFF4lW7a/eZpI2zjdvu7lwmOWyXX8iiPzhBVVEfd5oOorRyJYBsGMslp4sqV8TBkU5Ld/a97Q==", "requires": { "@aws-crypto/sha256-browser": "^1.0.0", "@aws-crypto/sha256-js": "^1.0.0", @@ -16526,10 +18918,10 @@ } } }, - "@aws-sdk/client-pinpoint": { + "@aws-sdk/client-translate": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-pinpoint/-/client-pinpoint-3.6.1.tgz", - "integrity": "sha512-dueBedp91EKAHxcWLR3aNx/eUEdxdF9niEQTzOO2O4iJL2yvO2Hh7ZYiO7B3g7FuuICTpWSHd//Y9mGmSVLMCg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-translate/-/client-translate-3.6.1.tgz", + "integrity": "sha512-RIHY+Og1i43B5aWlfUUk0ZFnNfM7j2vzlYUwOqhndawV49GFf96M3pmskR5sKEZI+5TXY77qR9TgZ/r3UxVCRQ==", "requires": { "@aws-crypto/sha256-browser": "^1.0.0", "@aws-crypto/sha256-js": "^1.0.0", @@ -16561,7 +18953,8 @@ "@aws-sdk/util-user-agent-node": "3.6.1", "@aws-sdk/util-utf8-browser": "3.6.1", "@aws-sdk/util-utf8-node": "3.6.1", - "tslib": "^2.0.0" + "tslib": "^2.0.0", + "uuid": "^3.0.0" }, "dependencies": { "@aws-crypto/sha256-js": { @@ -16588,3749 +18981,4548 @@ } } }, - "@aws-sdk/client-polly": { + "@aws-sdk/config-resolver": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.6.1.tgz", + "integrity": "sha512-qjP1g3jLIm+XvOIJ4J7VmZRi87vsDmTRzIFePVeG+EFWwYQLxQjTGMdIj3yKTh1WuZ0HByf47mGcpiS4HZLm1Q==", + "requires": { + "@aws-sdk/signature-v4": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.6.1.tgz", + "integrity": "sha512-uJ9q+yq+Dhdo32gcv0p/AT7sKSAUH0y4ts9XRK/vx0dW9Q3XJy99mOJlq/6fkh4LfWeavJJlaCo9lSHNMWXx4w==", + "requires": { + "@aws-sdk/client-cognito-identity": "3.6.1", + "@aws-sdk/property-provider": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.6.1.tgz", + "integrity": "sha512-coeFf/HnhpGidcAN1i1NuFgyFB2M6DeN1zNVy4f6s4mAh96ftr9DgWM1CcE3C+cLHEdpNqleVgC/2VQpyzOBLQ==", + "requires": { + "@aws-sdk/property-provider": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.6.1.tgz", + "integrity": "sha512-bf4LMI418OYcQbyLZRAW8Q5AYM2IKrNqOnIcfrFn2f17ulG7TzoWW3WN/kMOw4TC9+y+vIlCWOv87GxU1yP0Bg==", + "requires": { + "@aws-sdk/property-provider": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.6.1.tgz", + "integrity": "sha512-3jguW6+ttRNddRZvbrs1yb3F1jrUbqyv0UfRoHuOGthjTt+L9sDpJaJGugYnT3bS9WBu1NydLVE2kDV++mJGVw==", + "requires": { + "@aws-sdk/property-provider": "3.6.1", + "@aws-sdk/shared-ini-file-loader": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.6.1.tgz", + "integrity": "sha512-VAHOcsqkPrF1k/fA62pv9c75lUWe5bHpcbFX83C3EUPd2FXV10Lfkv6bdWhyZPQy0k8T+9/yikHH3c7ZQeFE5A==", + "requires": { + "@aws-sdk/credential-provider-env": "3.6.1", + "@aws-sdk/credential-provider-imds": "3.6.1", + "@aws-sdk/credential-provider-ini": "3.6.1", + "@aws-sdk/credential-provider-process": "3.6.1", + "@aws-sdk/property-provider": "3.6.1", + "@aws-sdk/shared-ini-file-loader": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.6.1.tgz", + "integrity": "sha512-d0/TpMoEV4qMYkdpyyjU2Otse9X2jC1DuxWajHOWZYEw8oejMvXYTZ10hNaXZvAcNM9q214rp+k4mkt6gIcI6g==", + "requires": { + "@aws-sdk/credential-provider-ini": "3.6.1", + "@aws-sdk/property-provider": "3.6.1", + "@aws-sdk/shared-ini-file-loader": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/eventstream-marshaller": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.6.1.tgz", + "integrity": "sha512-ZvN3Nvxn2Gul08L9MOSN123LwSO0E1gF/CqmOGZtEWzPnoSX/PWM9mhPPeXubyw2KdlXylOodYYw3EAATk3OmA==", + "requires": { + "@aws-crypto/crc32": "^1.0.0", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-hex-encoding": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/eventstream-serde-browser": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.6.1.tgz", + "integrity": "sha512-J8B30d+YUfkBtgWRr7+9AfYiPnbG28zjMlFGsJf8Wxr/hDCfff+Z8NzlBYFEbS7McXXhRiIN8DHUvCtolJtWJQ==", + "requires": { + "@aws-sdk/eventstream-marshaller": "3.6.1", + "@aws-sdk/eventstream-serde-universal": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.6.1.tgz", + "integrity": "sha512-72pCzcT/KeD4gPgRVBSQzEzz4JBim8bNwPwZCGaIYdYAsAI8YMlvp0JNdis3Ov9DFURc87YilWKQlAfw7CDJxA==", + "requires": { + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/eventstream-serde-node": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.6.1.tgz", + "integrity": "sha512-rjBbJFjCrEcm2NxZctp+eJmyPxKYayG3tQZo8PEAQSViIlK5QexQI3fgqNAeCtK7l/SFAAvnOMRZF6Z3NdUY6A==", + "requires": { + "@aws-sdk/eventstream-marshaller": "3.6.1", + "@aws-sdk/eventstream-serde-universal": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/eventstream-serde-universal": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.6.1.tgz", + "integrity": "sha512-rpRu97yAGHr9GQLWMzcGICR2PxNu1dHU/MYc9Kb6UgGeZd4fod4o1zjhAJuj98cXn2xwHNFM4wMKua6B4zKrZg==", + "requires": { + "@aws-sdk/eventstream-marshaller": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.6.1.tgz", + "integrity": "sha512-N8l6ZbwhINuWG5hsl625lmIQmVjzsqRPmlgh061jm5D90IhsM5/3A3wUxpB/k0av1dmuMRw/m0YtBU5w4LOwvw==", + "requires": { + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/querystring-builder": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-base64-browser": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/hash-blob-browser": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.6.1.tgz", + "integrity": "sha512-9jPaZ/e3F8gf9JZd44DD6MvbYV6bKnn99rkG3GFIINOy9etoxPrLehp2bH2DK/j0ow60RNuwgUjj5qHV/zF67g==", + "requires": { + "@aws-sdk/chunked-blob-reader": "3.6.1", + "@aws-sdk/chunked-blob-reader-native": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/hash-node": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.6.1.tgz", + "integrity": "sha512-iKEpzpyaG9PYCnaOGwTIf0lffsF/TpsXrzAfnBlfeOU/3FbgniW2z/yq5xBbtMDtLobtOYC09kUFwDnDvuveSA==", + "requires": { + "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-buffer-from": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/hash-stream-node": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.6.1.tgz", + "integrity": "sha512-ePaWjCItIWxuSxA/UnUM/keQ3IAOsQz3FYSxu0KK8K0e1bKTEUgDIG9oMLBq7jIl9TzJG0HBXuPfMe73QHUNug==", + "requires": { + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.6.1.tgz", + "integrity": "sha512-d0RLqK7yeDCZJKopnGmGXo2rYkQNE7sGKVmBHQD1j1kKZ9lWwRoJeWqo834JNPZzY5XRvZG5SuIjJ1kFy8LpyQ==", + "requires": { + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.6.1.tgz", + "integrity": "sha512-qm2iDJmCrxlQE2dsFG+TujPe7jw4DF+4RTrsFMhk/e3lOl3MAzQ6Fc2kXtgeUcVrZVFTL8fQvXE1ByYyI6WbCw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/md5-js": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.6.1.tgz", + "integrity": "sha512-lzCqkZF1sbzGFDyq1dI+lR3AmlE33rbC/JhZ5fzw3hJZvfZ6Beq3Su7YwDo65IWEu0zOKYaNywTeOloXP/CkxQ==", + "requires": { + "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-utf8-browser": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-apply-body-checksum": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-apply-body-checksum/-/middleware-apply-body-checksum-3.6.1.tgz", + "integrity": "sha512-IncmXR1MPk6aYvmD37It8dP6wVMzaxxzgrkIU2ACkN5UVwA+/0Sr3ZNd9dNwjpyoH1AwpL9BetnlJaWtT6K5ew==", + "requires": { + "@aws-sdk/is-array-buffer": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-bucket-endpoint": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.6.1.tgz", + "integrity": "sha512-Frcqn2RQDNHy+e2Q9hv3ejT3mQWtGlfZESbXEF6toR4M0R8MmEVqIB/ohI6VKBj11lRmGwvpPsR6zz+PJ8HS7A==", + "requires": { + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-arn-parser": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-content-length": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-polly/-/client-polly-3.6.1.tgz", - "integrity": "sha512-y6fxVYndGS7z2KqHViPCqagBEOsZlxBUYUJZuD6WWTiQrI0Pwe5qG02oKJVaa5OmxE20QLf6bRBWj2rQpeF4IQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.6.1.tgz", + "integrity": "sha512-QRcocG9f5YjYzbjs2HjKla6ZIjvx8Y8tm1ZSFOPey81m18CLif1O7M3AtJXvxn+0zeSck9StFdhz5gfjVNYtDg==", "requires": { - "@aws-crypto/sha256-browser": "^1.0.0", - "@aws-crypto/sha256-js": "^1.0.0", - "@aws-sdk/config-resolver": "3.6.1", - "@aws-sdk/credential-provider-node": "3.6.1", - "@aws-sdk/fetch-http-handler": "3.6.1", - "@aws-sdk/hash-node": "3.6.1", - "@aws-sdk/invalid-dependency": "3.6.1", - "@aws-sdk/middleware-content-length": "3.6.1", - "@aws-sdk/middleware-host-header": "3.6.1", - "@aws-sdk/middleware-logger": "3.6.1", - "@aws-sdk/middleware-retry": "3.6.1", - "@aws-sdk/middleware-serde": "3.6.1", - "@aws-sdk/middleware-signing": "3.6.1", - "@aws-sdk/middleware-stack": "3.6.1", - "@aws-sdk/middleware-user-agent": "3.6.1", - "@aws-sdk/node-config-provider": "3.6.1", - "@aws-sdk/node-http-handler": "3.6.1", "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/smithy-client": "3.6.1", "@aws-sdk/types": "3.6.1", - "@aws-sdk/url-parser": "3.6.1", - "@aws-sdk/url-parser-native": "3.6.1", - "@aws-sdk/util-base64-browser": "3.6.1", - "@aws-sdk/util-base64-node": "3.6.1", - "@aws-sdk/util-body-length-browser": "3.6.1", - "@aws-sdk/util-body-length-node": "3.6.1", - "@aws-sdk/util-user-agent-browser": "3.6.1", - "@aws-sdk/util-user-agent-node": "3.6.1", - "@aws-sdk/util-utf8-browser": "3.6.1", - "@aws-sdk/util-utf8-node": "3.6.1", - "tslib": "^2.0.0" - }, - "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", - "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", - "requires": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } + "tslib": "^1.8.0" } }, - "@aws-sdk/client-rekognition": { + "@aws-sdk/middleware-expect-continue": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-rekognition/-/client-rekognition-3.6.1.tgz", - "integrity": "sha512-Ia4FEog9RrI0IoDRbOJO6djwhVAAaEZutxEKrWbjrVz4bgib28L+V+yAio2SUneeirj8pNYXwBKPfoYOUqGHhA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.6.1.tgz", + "integrity": "sha512-vvMOqVYU3uvdJzg/X6NHewZUEBZhSqND1IEcdahLb6RmvDhsS39iS97VZmEFsjj/UFGoePtYjrrdEgRG9Rm1kQ==", "requires": { - "@aws-crypto/sha256-browser": "^1.0.0", - "@aws-crypto/sha256-js": "^1.0.0", - "@aws-sdk/config-resolver": "3.6.1", - "@aws-sdk/credential-provider-node": "3.6.1", - "@aws-sdk/fetch-http-handler": "3.6.1", - "@aws-sdk/hash-node": "3.6.1", - "@aws-sdk/invalid-dependency": "3.6.1", - "@aws-sdk/middleware-content-length": "3.6.1", - "@aws-sdk/middleware-host-header": "3.6.1", - "@aws-sdk/middleware-logger": "3.6.1", - "@aws-sdk/middleware-retry": "3.6.1", - "@aws-sdk/middleware-serde": "3.6.1", - "@aws-sdk/middleware-signing": "3.6.1", - "@aws-sdk/middleware-stack": "3.6.1", - "@aws-sdk/middleware-user-agent": "3.6.1", - "@aws-sdk/node-config-provider": "3.6.1", - "@aws-sdk/node-http-handler": "3.6.1", + "@aws-sdk/middleware-header-default": "3.6.1", "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/smithy-client": "3.6.1", "@aws-sdk/types": "3.6.1", - "@aws-sdk/url-parser": "3.6.1", - "@aws-sdk/url-parser-native": "3.6.1", - "@aws-sdk/util-base64-browser": "3.6.1", - "@aws-sdk/util-base64-node": "3.6.1", - "@aws-sdk/util-body-length-browser": "3.6.1", - "@aws-sdk/util-body-length-node": "3.6.1", - "@aws-sdk/util-user-agent-browser": "3.6.1", - "@aws-sdk/util-user-agent-node": "3.6.1", - "@aws-sdk/util-utf8-browser": "3.6.1", - "@aws-sdk/util-utf8-node": "3.6.1", - "@aws-sdk/util-waiter": "3.6.1", - "tslib": "^2.0.0" - }, - "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", - "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", - "requires": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } + "tslib": "^1.8.0" } }, - "@aws-sdk/client-s3": { + "@aws-sdk/middleware-header-default": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.6.1.tgz", - "integrity": "sha512-59cTmZj92iwgNoAeJirK5sZNQNXLc/oI3luqrEHRNLuOh70bjdgad70T0a5k2Ysd/v/QNamqJxnCJMPuX1bhgw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.6.1.tgz", + "integrity": "sha512-YD137iIctXVH8Eut0WOBalvvA+uL0jM0UXZ9N2oKrC8kPQPpqjK9lYGFKZQFsl/XlQHAjJi+gCAFrYsBntRWJQ==", "requires": { - "@aws-crypto/sha256-browser": "^1.0.0", - "@aws-crypto/sha256-js": "^1.0.0", - "@aws-sdk/config-resolver": "3.6.1", - "@aws-sdk/credential-provider-node": "3.6.1", - "@aws-sdk/eventstream-serde-browser": "3.6.1", - "@aws-sdk/eventstream-serde-config-resolver": "3.6.1", - "@aws-sdk/eventstream-serde-node": "3.6.1", - "@aws-sdk/fetch-http-handler": "3.6.1", - "@aws-sdk/hash-blob-browser": "3.6.1", - "@aws-sdk/hash-node": "3.6.1", - "@aws-sdk/hash-stream-node": "3.6.1", - "@aws-sdk/invalid-dependency": "3.6.1", - "@aws-sdk/md5-js": "3.6.1", - "@aws-sdk/middleware-apply-body-checksum": "3.6.1", - "@aws-sdk/middleware-bucket-endpoint": "3.6.1", - "@aws-sdk/middleware-content-length": "3.6.1", - "@aws-sdk/middleware-expect-continue": "3.6.1", - "@aws-sdk/middleware-host-header": "3.6.1", - "@aws-sdk/middleware-location-constraint": "3.6.1", - "@aws-sdk/middleware-logger": "3.6.1", - "@aws-sdk/middleware-retry": "3.6.1", - "@aws-sdk/middleware-sdk-s3": "3.6.1", - "@aws-sdk/middleware-serde": "3.6.1", - "@aws-sdk/middleware-signing": "3.6.1", - "@aws-sdk/middleware-ssec": "3.6.1", - "@aws-sdk/middleware-stack": "3.6.1", - "@aws-sdk/middleware-user-agent": "3.6.1", - "@aws-sdk/node-config-provider": "3.6.1", - "@aws-sdk/node-http-handler": "3.6.1", "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/smithy-client": "3.6.1", "@aws-sdk/types": "3.6.1", - "@aws-sdk/url-parser": "3.6.1", - "@aws-sdk/url-parser-native": "3.6.1", - "@aws-sdk/util-base64-browser": "3.6.1", - "@aws-sdk/util-base64-node": "3.6.1", - "@aws-sdk/util-body-length-browser": "3.6.1", - "@aws-sdk/util-body-length-node": "3.6.1", - "@aws-sdk/util-user-agent-browser": "3.6.1", - "@aws-sdk/util-user-agent-node": "3.6.1", - "@aws-sdk/util-utf8-browser": "3.6.1", - "@aws-sdk/util-utf8-node": "3.6.1", - "@aws-sdk/util-waiter": "3.6.1", - "@aws-sdk/xml-builder": "3.6.1", - "fast-xml-parser": "^3.16.0", - "tslib": "^2.0.0" - }, - "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", - "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", - "requires": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } + "tslib": "^1.8.0" } }, - "@aws-sdk/client-textract": { + "@aws-sdk/middleware-host-header": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-textract/-/client-textract-3.6.1.tgz", - "integrity": "sha512-nLrBzWDt3ToiGVFF4lW7a/eZpI2zjdvu7lwmOWyXX8iiPzhBVVEfd5oOorRyJYBsGMslp4sqV8TBkU5Ld/a97Q==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.6.1.tgz", + "integrity": "sha512-nwq8R2fGBRZQE0Fr/jiOgqfppfiTQCUoD8hyX3qSS7Qc2uqpsDOt2TnnoZl56mpQYkF/344IvMAkp+ew6wR73w==", "requires": { - "@aws-crypto/sha256-browser": "^1.0.0", - "@aws-crypto/sha256-js": "^1.0.0", - "@aws-sdk/config-resolver": "3.6.1", - "@aws-sdk/credential-provider-node": "3.6.1", - "@aws-sdk/fetch-http-handler": "3.6.1", - "@aws-sdk/hash-node": "3.6.1", - "@aws-sdk/invalid-dependency": "3.6.1", - "@aws-sdk/middleware-content-length": "3.6.1", - "@aws-sdk/middleware-host-header": "3.6.1", - "@aws-sdk/middleware-logger": "3.6.1", - "@aws-sdk/middleware-retry": "3.6.1", - "@aws-sdk/middleware-serde": "3.6.1", - "@aws-sdk/middleware-signing": "3.6.1", - "@aws-sdk/middleware-stack": "3.6.1", - "@aws-sdk/middleware-user-agent": "3.6.1", - "@aws-sdk/node-config-provider": "3.6.1", - "@aws-sdk/node-http-handler": "3.6.1", "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/smithy-client": "3.6.1", - "@aws-sdk/types": "3.6.1", - "@aws-sdk/url-parser": "3.6.1", - "@aws-sdk/url-parser-native": "3.6.1", - "@aws-sdk/util-base64-browser": "3.6.1", - "@aws-sdk/util-base64-node": "3.6.1", - "@aws-sdk/util-body-length-browser": "3.6.1", - "@aws-sdk/util-body-length-node": "3.6.1", - "@aws-sdk/util-user-agent-browser": "3.6.1", - "@aws-sdk/util-user-agent-node": "3.6.1", - "@aws-sdk/util-utf8-browser": "3.6.1", - "@aws-sdk/util-utf8-node": "3.6.1", - "tslib": "^2.0.0" - }, - "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", - "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", - "requires": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" } }, - "@aws-sdk/client-translate": { + "@aws-sdk/middleware-location-constraint": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-translate/-/client-translate-3.6.1.tgz", - "integrity": "sha512-RIHY+Og1i43B5aWlfUUk0ZFnNfM7j2vzlYUwOqhndawV49GFf96M3pmskR5sKEZI+5TXY77qR9TgZ/r3UxVCRQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.6.1.tgz", + "integrity": "sha512-nFisTc0O5D+4I+sRxiiLPasC/I4NDc3s+hgbPPt/b3uAdrujJjhwFBOSaTx8qQvz/xJPAA8pUA/bfWIyeZKi/w==", + "requires": { + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.6.1.tgz", + "integrity": "sha512-zxaSLpwKlja7JvK20UsDTxPqBZUo3rbDA1uv3VWwpxzOrEWSlVZYx/KLuyGWGkx9V71ZEkf6oOWWJIstS0wyQQ==", + "requires": { + "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.6.1.tgz", + "integrity": "sha512-WHeo4d2jsXxBP+cec2SeLb0btYXwYXuE56WLmNt0RvJYmiBzytUeGJeRa9HuwV574kgigAuHGCeHlPO36G4Y0Q==", "requires": { - "@aws-crypto/sha256-browser": "^1.0.0", - "@aws-crypto/sha256-js": "^1.0.0", - "@aws-sdk/config-resolver": "3.6.1", - "@aws-sdk/credential-provider-node": "3.6.1", - "@aws-sdk/fetch-http-handler": "3.6.1", - "@aws-sdk/hash-node": "3.6.1", - "@aws-sdk/invalid-dependency": "3.6.1", - "@aws-sdk/middleware-content-length": "3.6.1", - "@aws-sdk/middleware-host-header": "3.6.1", - "@aws-sdk/middleware-logger": "3.6.1", - "@aws-sdk/middleware-retry": "3.6.1", - "@aws-sdk/middleware-serde": "3.6.1", - "@aws-sdk/middleware-signing": "3.6.1", - "@aws-sdk/middleware-stack": "3.6.1", - "@aws-sdk/middleware-user-agent": "3.6.1", - "@aws-sdk/node-config-provider": "3.6.1", - "@aws-sdk/node-http-handler": "3.6.1", "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/smithy-client": "3.6.1", + "@aws-sdk/service-error-classification": "3.6.1", "@aws-sdk/types": "3.6.1", - "@aws-sdk/url-parser": "3.6.1", - "@aws-sdk/url-parser-native": "3.6.1", - "@aws-sdk/util-base64-browser": "3.6.1", - "@aws-sdk/util-base64-node": "3.6.1", - "@aws-sdk/util-body-length-browser": "3.6.1", - "@aws-sdk/util-body-length-node": "3.6.1", - "@aws-sdk/util-user-agent-browser": "3.6.1", - "@aws-sdk/util-user-agent-node": "3.6.1", - "@aws-sdk/util-utf8-browser": "3.6.1", - "@aws-sdk/util-utf8-node": "3.6.1", - "tslib": "^2.0.0", + "react-native-get-random-values": "^1.4.0", + "tslib": "^1.8.0", "uuid": "^3.0.0" }, "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", - "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "@react-native-community/cli": { + "version": "5.0.1-alpha.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-5.0.1-alpha.2.tgz", + "integrity": "sha512-PP22TVV2VyELXhAX4PcBisasssastSEx23XDklfPoCPIXD2QgGC7y39n/b5I9tOzKi2qYswCEAcDpwXYwevGOg==", + "peer": true, "requires": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@react-native-community/cli-debugger-ui": "^5.0.1-alpha.1", + "@react-native-community/cli-hermes": "^5.0.1-alpha.1", + "@react-native-community/cli-server-api": "^5.0.1-alpha.2", + "@react-native-community/cli-tools": "^5.0.1-alpha.1", + "@react-native-community/cli-types": "^5.0.1-alpha.1", + "appdirsjs": "^1.2.4", + "chalk": "^3.0.0", + "command-exists": "^1.2.8", + "commander": "^2.19.0", + "cosmiconfig": "^5.1.0", + "deepmerge": "^3.2.0", + "envinfo": "^7.7.2", + "execa": "^1.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.3", + "graceful-fs": "^4.1.3", + "joi": "^17.2.1", + "leven": "^3.1.0", + "lodash": "^4.17.15", + "metro": "^0.64.0", + "metro-config": "^0.64.0", + "metro-core": "^0.64.0", + "metro-react-native-babel-transformer": "^0.64.0", + "metro-resolver": "^0.64.0", + "metro-runtime": "^0.64.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "node-stream-zip": "^1.9.1", + "ora": "^3.4.0", + "pretty-format": "^26.6.2", + "prompts": "^2.4.0", + "semver": "^6.3.0", + "serve-static": "^1.13.1", + "strip-ansi": "^5.2.0", + "sudo-prompt": "^9.0.0", + "wcwidth": "^1.0.1" } }, - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "peer": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": true + }, + "react": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-native": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.64.0.tgz", + "integrity": "sha512-8dhSHBthgGwAjU+OjqUEA49229ThPMQH7URH0u8L0xoQFCnZO2sZ9Wc6KcbxI0x9KSmjCMFFZqRe3w3QsRv64g==", + "peer": true, + "requires": { + "@jest/create-cache-key-function": "^26.5.0", + "@react-native-community/cli": "^5.0.1-alpha.0", + "@react-native-community/cli-platform-android": "^5.0.1-alpha.0", + "@react-native-community/cli-platform-ios": "^5.0.1-alpha.0", + "@react-native/assets": "1.0.0", + "@react-native/normalize-color": "1.0.0", + "@react-native/polyfills": "1.0.0", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "base64-js": "^1.1.2", + "event-target-shim": "^5.0.1", + "hermes-engine": "~0.7.0", + "invariant": "^2.2.4", + "jsc-android": "^245459.0.0", + "metro-babel-register": "0.64.0", + "metro-react-native-babel-transformer": "0.64.0", + "metro-runtime": "0.64.0", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1", + "pretty-format": "^26.5.2", + "promise": "^8.0.3", + "prop-types": "^15.7.2", + "react-devtools-core": "^4.6.0", + "react-native-codegen": "^0.0.6", + "react-refresh": "^0.4.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "^0.20.1", + "shelljs": "^0.8.4", + "stacktrace-parser": "^0.1.3", + "use-subscription": "^1.0.0", + "whatwg-fetch": "^3.0.0", + "ws": "^6.1.4" + } + }, + "react-native-get-random-values": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/react-native-get-random-values/-/react-native-get-random-values-1.7.0.tgz", + "integrity": "sha512-zDhmpWUekGRFb9I+MQkxllHcqXN9HBSsgPwBQfrZ1KZYpzDspWLZ6/yLMMZrtq4pVqNR7C7N96L3SuLpXv1nhQ==", + "requires": { + "fast-base64-decode": "^1.0.0" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "@aws-sdk/config-resolver": { + "@aws-sdk/middleware-sdk-s3": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.6.1.tgz", - "integrity": "sha512-qjP1g3jLIm+XvOIJ4J7VmZRi87vsDmTRzIFePVeG+EFWwYQLxQjTGMdIj3yKTh1WuZ0HByf47mGcpiS4HZLm1Q==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.6.1.tgz", + "integrity": "sha512-HEA9kynNTsOSIIz8p5GEEAH03pnn+SSohwPl80sGqkmI1yl1tzjqgYZRii0e6acJTh4j9655XFzSx36hYPeB2w==", "requires": { - "@aws-sdk/signature-v4": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-arn-parser": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/credential-provider-cognito-identity": { + "@aws-sdk/middleware-serde": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.6.1.tgz", - "integrity": "sha512-uJ9q+yq+Dhdo32gcv0p/AT7sKSAUH0y4ts9XRK/vx0dW9Q3XJy99mOJlq/6fkh4LfWeavJJlaCo9lSHNMWXx4w==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.6.1.tgz", + "integrity": "sha512-EdQCFZRERfP3uDuWcPNuaa2WUR3qL1WFDXafhcx+7ywQxagdYqBUWKFJlLYi6njbkOKXFM+eHBzoXGF0OV3MJA==", "requires": { - "@aws-sdk/client-cognito-identity": "3.6.1", - "@aws-sdk/property-provider": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/credential-provider-env": { + "@aws-sdk/middleware-signing": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.6.1.tgz", - "integrity": "sha512-coeFf/HnhpGidcAN1i1NuFgyFB2M6DeN1zNVy4f6s4mAh96ftr9DgWM1CcE3C+cLHEdpNqleVgC/2VQpyzOBLQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.6.1.tgz", + "integrity": "sha512-1woKq+1sU3eausdl8BNdAMRZMkSYuy4mxhLsF0/qAUuLwo1eJLLUCOQp477tICawgu4O4q2OAyUHk7wMqYnQCg==", "requires": { - "@aws-sdk/property-provider": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/signature-v4": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/credential-provider-imds": { + "@aws-sdk/middleware-ssec": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.6.1.tgz", - "integrity": "sha512-bf4LMI418OYcQbyLZRAW8Q5AYM2IKrNqOnIcfrFn2f17ulG7TzoWW3WN/kMOw4TC9+y+vIlCWOv87GxU1yP0Bg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.6.1.tgz", + "integrity": "sha512-svuH6s91uKUTORt51msiL/ZBjtYSW32c3uVoWxludd/PEf6zO5wCmUEsKoyVwa88L7rrCq+81UBv5A8S5kc3Cw==", "requires": { - "@aws-sdk/property-provider": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/credential-provider-ini": { + "@aws-sdk/middleware-stack": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.6.1.tgz", - "integrity": "sha512-3jguW6+ttRNddRZvbrs1yb3F1jrUbqyv0UfRoHuOGthjTt+L9sDpJaJGugYnT3bS9WBu1NydLVE2kDV++mJGVw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.6.1.tgz", + "integrity": "sha512-EPsIxMi8LtCt7YwTFpWGlVGYJc0q4kwFbOssY02qfqdCnyqi2y5wo089dH7OdxUooQ0D7CPsXM1zTTuzvm+9Fw==", "requires": { - "@aws-sdk/property-provider": "3.6.1", - "@aws-sdk/shared-ini-file-loader": "3.6.1", - "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/credential-provider-node": { + "@aws-sdk/middleware-user-agent": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.6.1.tgz", - "integrity": "sha512-VAHOcsqkPrF1k/fA62pv9c75lUWe5bHpcbFX83C3EUPd2FXV10Lfkv6bdWhyZPQy0k8T+9/yikHH3c7ZQeFE5A==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.6.1.tgz", + "integrity": "sha512-YvXvwllNDVvxQ30vIqLsx+P6jjnfFEQUmhlv64n98gOme6h2BqoyQDcC3yHRGctuxRZEsR7W/H1ASTKC+iabbQ==", "requires": { - "@aws-sdk/credential-provider-env": "3.6.1", - "@aws-sdk/credential-provider-imds": "3.6.1", - "@aws-sdk/credential-provider-ini": "3.6.1", - "@aws-sdk/credential-provider-process": "3.6.1", - "@aws-sdk/property-provider": "3.6.1", - "@aws-sdk/shared-ini-file-loader": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/credential-provider-process": { + "@aws-sdk/node-config-provider": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.6.1.tgz", - "integrity": "sha512-d0/TpMoEV4qMYkdpyyjU2Otse9X2jC1DuxWajHOWZYEw8oejMvXYTZ10hNaXZvAcNM9q214rp+k4mkt6gIcI6g==", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.6.1.tgz", + "integrity": "sha512-x2Z7lm0ZhHYqMybvkaI5hDKfBkaLaXhTDfgrLl9TmBZ3QHO4fIHgeL82VZ90Paol+OS+jdq2AheLmzbSxv3HrA==", "requires": { - "@aws-sdk/credential-provider-ini": "3.6.1", "@aws-sdk/property-provider": "3.6.1", "@aws-sdk/shared-ini-file-loader": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/eventstream-marshaller": { + "@aws-sdk/node-http-handler": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.6.1.tgz", - "integrity": "sha512-ZvN3Nvxn2Gul08L9MOSN123LwSO0E1gF/CqmOGZtEWzPnoSX/PWM9mhPPeXubyw2KdlXylOodYYw3EAATk3OmA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.6.1.tgz", + "integrity": "sha512-6XSaoqbm9ZF6T4UdBCcs/Gn2XclwBotkdjj46AxO+9vRAgZDP+lH/8WwZsvfqJhhRhS0qxWrks98WGJwmaTG8g==", "requires": { - "@aws-crypto/crc32": "^1.0.0", + "@aws-sdk/abort-controller": "3.6.1", + "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/querystring-builder": "3.6.1", "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-hex-encoding": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/eventstream-serde-browser": { + "@aws-sdk/property-provider": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.6.1.tgz", - "integrity": "sha512-J8B30d+YUfkBtgWRr7+9AfYiPnbG28zjMlFGsJf8Wxr/hDCfff+Z8NzlBYFEbS7McXXhRiIN8DHUvCtolJtWJQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.6.1.tgz", + "integrity": "sha512-2gR2DzDySXKFoj9iXLm1TZBVSvFIikEPJsbRmAZx5RBY+tp1IXWqZM6PESjaLdLg/ZtR0QhW2ZcRn0fyq2JfnQ==", "requires": { - "@aws-sdk/eventstream-marshaller": "3.6.1", - "@aws-sdk/eventstream-serde-universal": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/eventstream-serde-config-resolver": { + "@aws-sdk/protocol-http": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.6.1.tgz", - "integrity": "sha512-72pCzcT/KeD4gPgRVBSQzEzz4JBim8bNwPwZCGaIYdYAsAI8YMlvp0JNdis3Ov9DFURc87YilWKQlAfw7CDJxA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.6.1.tgz", + "integrity": "sha512-WkQz7ncVYTLvCidDfXWouDzqxgSNPZDz3Bql+7VhZeITnzAEcr4hNMyEqMAVYBVugGmkG2W6YiUqNNs1goOcDA==", "requires": { "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/eventstream-serde-node": { + "@aws-sdk/querystring-builder": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.6.1.tgz", - "integrity": "sha512-rjBbJFjCrEcm2NxZctp+eJmyPxKYayG3tQZo8PEAQSViIlK5QexQI3fgqNAeCtK7l/SFAAvnOMRZF6Z3NdUY6A==", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.6.1.tgz", + "integrity": "sha512-ESe255Yl6vB1AMNqaGSQow3TBYYnpw0AFjE40q2VyiNrkbaqKmW2EzjeCy3wEmB1IfJDHy3O12ZOMUMOnjFT8g==", "requires": { - "@aws-sdk/eventstream-marshaller": "3.6.1", - "@aws-sdk/eventstream-serde-universal": "3.6.1", "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-uri-escape": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/eventstream-serde-universal": { + "@aws-sdk/querystring-parser": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.6.1.tgz", - "integrity": "sha512-rpRu97yAGHr9GQLWMzcGICR2PxNu1dHU/MYc9Kb6UgGeZd4fod4o1zjhAJuj98cXn2xwHNFM4wMKua6B4zKrZg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.6.1.tgz", + "integrity": "sha512-hh6dhqamKrWWaDSuO2YULci0RGwJWygoy8hpCRxs/FpzzHIcbm6Cl6Jhrn5eKBzOBv+PhCcYwbfad0kIZZovcQ==", "requires": { - "@aws-sdk/eventstream-marshaller": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/fetch-http-handler": { + "@aws-sdk/s3-request-presigner": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.6.1.tgz", - "integrity": "sha512-N8l6ZbwhINuWG5hsl625lmIQmVjzsqRPmlgh061jm5D90IhsM5/3A3wUxpB/k0av1dmuMRw/m0YtBU5w4LOwvw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.6.1.tgz", + "integrity": "sha512-OI7UHCKBwuiO/RmHHewBKnL2NYqdilXRmpX67TJ4tTszIrWP2+vpm3lIfrx/BM8nf8nKTzgkO98uFhoJsEhmTg==", "requires": { "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/querystring-builder": "3.6.1", + "@aws-sdk/signature-v4": "3.6.1", + "@aws-sdk/smithy-client": "3.6.1", "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-base64-browser": "3.6.1", + "@aws-sdk/util-create-request": "3.6.1", + "@aws-sdk/util-format-url": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/hash-blob-browser": { + "@aws-sdk/service-error-classification": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.6.1.tgz", - "integrity": "sha512-9jPaZ/e3F8gf9JZd44DD6MvbYV6bKnn99rkG3GFIINOy9etoxPrLehp2bH2DK/j0ow60RNuwgUjj5qHV/zF67g==", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.6.1.tgz", + "integrity": "sha512-kZ7ZhbrN1f+vrSRkTJvXsu7BlOyZgym058nPA745+1RZ1Rtv4Ax8oknf2RvJyj/1qRUi8LBaAREjzQ3C8tmLBA==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.6.1.tgz", + "integrity": "sha512-BnLHtsNLOoow6rPV+QVi6jnovU5g1m0YzoUG0BQYZ1ALyVlWVr0VvlUX30gMDfdYoPMp+DHvF8GXdMuGINq6kQ==", "requires": { - "@aws-sdk/chunked-blob-reader": "3.6.1", - "@aws-sdk/chunked-blob-reader-native": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.6.1.tgz", + "integrity": "sha512-EAR0qGVL4AgzodZv4t+BSuBfyOXhTNxDxom50IFI1MqidR9vI6avNZKcPHhgXbm7XVcsDGThZKbzQ2q7MZ2NTA==", + "requires": { + "@aws-sdk/is-array-buffer": "3.6.1", "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-hex-encoding": "3.6.1", + "@aws-sdk/util-uri-escape": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/hash-node": { + "@aws-sdk/smithy-client": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.6.1.tgz", - "integrity": "sha512-iKEpzpyaG9PYCnaOGwTIf0lffsF/TpsXrzAfnBlfeOU/3FbgniW2z/yq5xBbtMDtLobtOYC09kUFwDnDvuveSA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.6.1.tgz", + "integrity": "sha512-AVpRK4/iUxNeDdAm8UqP0ZgtgJMQeWcagTylijwelhWXyXzHUReY1sgILsWcdWnoy6gq845W7K2VBhBleni8+w==", "requires": { + "@aws-sdk/middleware-stack": "3.6.1", "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-buffer-from": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/hash-stream-node": { + "@aws-sdk/types": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.6.1.tgz", - "integrity": "sha512-ePaWjCItIWxuSxA/UnUM/keQ3IAOsQz3FYSxu0KK8K0e1bKTEUgDIG9oMLBq7jIl9TzJG0HBXuPfMe73QHUNug==", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.6.1.tgz", + "integrity": "sha512-4Dx3eRTrUHLxhFdLJL8zdNGzVsJfAxtxPYYGmIddUkO2Gj3WA1TGjdfG4XN/ClI6e1XonCHafQX3UYO/mgnH3g==" + }, + "@aws-sdk/url-parser": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.6.1.tgz", + "integrity": "sha512-pWFIePDx0PMCleQRsQDWoDl17YiijOLj0ZobN39rQt+wv5PhLSZDz9PgJsqS48nZ6hqsKgipRcjiBMhn5NtFcQ==", "requires": { + "@aws-sdk/querystring-parser": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/invalid-dependency": { + "@aws-sdk/url-parser-native": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.6.1.tgz", - "integrity": "sha512-d0RLqK7yeDCZJKopnGmGXo2rYkQNE7sGKVmBHQD1j1kKZ9lWwRoJeWqo834JNPZzY5XRvZG5SuIjJ1kFy8LpyQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser-native/-/url-parser-native-3.6.1.tgz", + "integrity": "sha512-3O+ktsrJoE8YQCho9L41YXO8EWILXrSeES7amUaV3mgIV5w4S3SB/r4RkmylpqRpQF7Ry8LFiAnMqH1wa4WBPA==", "requires": { + "@aws-sdk/querystring-parser": "3.6.1", "@aws-sdk/types": "3.6.1", + "tslib": "^1.8.0", + "url": "^0.11.0" + } + }, + "@aws-sdk/util-arn-parser": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.6.1.tgz", + "integrity": "sha512-NFdYeuhaSrgnBG6Pt3zHNU7QwvhHq6sKUTWZShUayLMJYYbQr6IjmYVlPST4c84b+lyDoK68y/Zga621VfIdBg==", + "requires": { "tslib": "^1.8.0" } }, - "@aws-sdk/is-array-buffer": { + "@aws-sdk/util-base64-browser": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.6.1.tgz", - "integrity": "sha512-qm2iDJmCrxlQE2dsFG+TujPe7jw4DF+4RTrsFMhk/e3lOl3MAzQ6Fc2kXtgeUcVrZVFTL8fQvXE1ByYyI6WbCw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.6.1.tgz", + "integrity": "sha512-+DHAIgt0AFARDVC7J0Z9FkSmJhBMlkYdOPeAAgO0WaQoKj7rtsLQJ7P3v3aS1paKN5/sk5xNY7ziVB6uHtOvHA==", "requires": { "tslib": "^1.8.0" } }, - "@aws-sdk/md5-js": { + "@aws-sdk/util-base64-node": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.6.1.tgz", - "integrity": "sha512-lzCqkZF1sbzGFDyq1dI+lR3AmlE33rbC/JhZ5fzw3hJZvfZ6Beq3Su7YwDo65IWEu0zOKYaNywTeOloXP/CkxQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.6.1.tgz", + "integrity": "sha512-oiqzpsvtTSS92+cL3ykhGd7t3qBJKeHvrgOwUyEf1wFWHQ2DPJR+dIMy5rMFRXWLKCl3w7IddY2rJCkLYMjaqQ==", "requires": { - "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-utf8-browser": "3.6.1", + "@aws-sdk/util-buffer-from": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-apply-body-checksum": { + "@aws-sdk/util-body-length-browser": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-apply-body-checksum/-/middleware-apply-body-checksum-3.6.1.tgz", - "integrity": "sha512-IncmXR1MPk6aYvmD37It8dP6wVMzaxxzgrkIU2ACkN5UVwA+/0Sr3ZNd9dNwjpyoH1AwpL9BetnlJaWtT6K5ew==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.6.1.tgz", + "integrity": "sha512-IdWwE3rm/CFDk2F+IwTZOFTnnNW5SB8y1lWiQ54cfc7y03hO6jmXNnpZGZ5goHhT+vf1oheNQt1J47m0pM/Irw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.6.1.tgz", + "integrity": "sha512-CUG3gc18bSOsqViQhB3M4AlLpAWV47RE6yWJ6rLD0J6/rSuzbwbjzxM39q0YTAVuSo/ivdbij+G9c3QCirC+QQ==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.6.1.tgz", + "integrity": "sha512-OGUh2B5NY4h7iRabqeZ+EgsrzE1LUmNFzMyhoZv0tO4NExyfQjxIYXLQQvydeOq9DJUbCw+yrRZrj8vXNDQG+g==", "requires": { "@aws-sdk/is-array-buffer": "3.6.1", - "@aws-sdk/protocol-http": "3.6.1", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-create-request": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.6.1.tgz", + "integrity": "sha512-jR1U8WpwXl+xZ9ThS42Jr5MXuegQ7QioHsZjQn3V5pbm8CXTkBF0B2BcULQu/2G1XtHOJb8qUZQlk/REoaORfQ==", + "requires": { + "@aws-sdk/middleware-stack": "3.6.1", + "@aws-sdk/smithy-client": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-bucket-endpoint": { + "@aws-sdk/util-format-url": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.6.1.tgz", - "integrity": "sha512-Frcqn2RQDNHy+e2Q9hv3ejT3mQWtGlfZESbXEF6toR4M0R8MmEVqIB/ohI6VKBj11lRmGwvpPsR6zz+PJ8HS7A==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.6.1.tgz", + "integrity": "sha512-FvhcXcqLyJ0j0WdlmGs7PtjCCv8NaY4zBuXYO2iwAmqoy2SIZXQL63uAvmilqWj25q47ASAsUwSFLReCCfMklQ==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/querystring-builder": "3.6.1", "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-arn-parser": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-content-length": { + "@aws-sdk/util-hex-encoding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.6.1.tgz", + "integrity": "sha512-pzsGOHtU2eGca4NJgFg94lLaeXDOg8pcS9sVt4f9LmtUGbrqRveeyBv0XlkHeZW2n0IZBssPHipVYQFlk7iaRA==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.12.0.tgz", + "integrity": "sha512-hon4/fx/MKdDbajQGK/RVn9k+wtLtwIlJnys/yZs9swq4m7B1/JnlDqSwClxjiVnsbDlu95UcYclospSkHIWUw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.6.1.tgz", + "integrity": "sha512-tgABiT71r0ScRJZ1pMX0xO0QPMMiISCtumph50IU5VDyZWYgeIxqkMhIcrL1lX0QbNCMgX0n6rZxGrrbjDNavA==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-user-agent-browser": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.6.1.tgz", - "integrity": "sha512-QRcocG9f5YjYzbjs2HjKla6ZIjvx8Y8tm1ZSFOPey81m18CLif1O7M3AtJXvxn+0zeSck9StFdhz5gfjVNYtDg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.6.1.tgz", + "integrity": "sha512-KhJ4VED4QpuBVPXoTjb5LqspX1xHWJTuL8hbPrKfxj+cAaRRW2CNEe7PPy2CfuHtPzP3dU3urtGTachbwNb0jg==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", "@aws-sdk/types": "3.6.1", + "bowser": "^2.11.0", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-expect-continue": { + "@aws-sdk/util-user-agent-node": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.6.1.tgz", - "integrity": "sha512-vvMOqVYU3uvdJzg/X6NHewZUEBZhSqND1IEcdahLb6RmvDhsS39iS97VZmEFsjj/UFGoePtYjrrdEgRG9Rm1kQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.6.1.tgz", + "integrity": "sha512-PWwL5EDRwhkXX40m5jjgttlBmLA7vDhHBen1Jcle0RPIDFRVPSE7GgvLF3y4r3SNH0WD6hxqadT50bHQynXW6w==", "requires": { - "@aws-sdk/middleware-header-default": "3.6.1", - "@aws-sdk/protocol-http": "3.6.1", + "@aws-sdk/node-config-provider": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-header-default": { + "@aws-sdk/util-utf8-browser": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.6.1.tgz", - "integrity": "sha512-YD137iIctXVH8Eut0WOBalvvA+uL0jM0UXZ9N2oKrC8kPQPpqjK9lYGFKZQFsl/XlQHAjJi+gCAFrYsBntRWJQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.6.1.tgz", + "integrity": "sha512-gZPySY6JU5gswnw3nGOEHl3tYE7vPKvtXGYoS2NRabfDKRejFvu+4/nNW6SSpoOxk6LSXsrWB39NO51k+G4PVA==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-host-header": { + "@aws-sdk/util-utf8-node": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.6.1.tgz", - "integrity": "sha512-nwq8R2fGBRZQE0Fr/jiOgqfppfiTQCUoD8hyX3qSS7Qc2uqpsDOt2TnnoZl56mpQYkF/344IvMAkp+ew6wR73w==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.6.1.tgz", + "integrity": "sha512-4s0vYfMUn74XLn13rUUhNsmuPMh0j1d4rF58wXtjlVUU78THxonnN8mbCLC48fI3fKDHTmDDkeEqy7+IWP9VyA==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/types": "3.6.1", + "@aws-sdk/util-buffer-from": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-location-constraint": { + "@aws-sdk/util-waiter": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.6.1.tgz", - "integrity": "sha512-nFisTc0O5D+4I+sRxiiLPasC/I4NDc3s+hgbPPt/b3uAdrujJjhwFBOSaTx8qQvz/xJPAA8pUA/bfWIyeZKi/w==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.6.1.tgz", + "integrity": "sha512-CQMRteoxW1XZSzPBVrTsOTnfzsEGs8N/xZ8BuBnXLBjoIQmRKVxIH9lgphm1ohCtVHoSWf28XH/KoOPFULQ4Tg==", "requires": { + "@aws-sdk/abort-controller": "3.6.1", "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-logger": { + "@aws-sdk/xml-builder": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.6.1.tgz", - "integrity": "sha512-zxaSLpwKlja7JvK20UsDTxPqBZUo3rbDA1uv3VWwpxzOrEWSlVZYx/KLuyGWGkx9V71ZEkf6oOWWJIstS0wyQQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.6.1.tgz", + "integrity": "sha512-+HOCH4a0XO+I09okd0xdVP5Q5c9ZsEsDvnogiOcBQxoMivWhPUCo9pjXP3buCvVKP2oDHXQplBKSjGHvGaKFdg==", "requires": { - "@aws-sdk/types": "3.6.1", "tslib": "^1.8.0" } }, - "@aws-sdk/middleware-retry": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.6.1.tgz", - "integrity": "sha512-WHeo4d2jsXxBP+cec2SeLb0btYXwYXuE56WLmNt0RvJYmiBzytUeGJeRa9HuwV574kgigAuHGCeHlPO36G4Y0Q==", + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/service-error-classification": "3.6.1", - "@aws-sdk/types": "3.6.1", - "react-native-get-random-values": "^1.4.0", - "tslib": "^1.8.0", - "uuid": "^3.0.0" - }, - "dependencies": { - "@react-native-community/cli": { - "version": "5.0.1-alpha.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-5.0.1-alpha.2.tgz", - "integrity": "sha512-PP22TVV2VyELXhAX4PcBisasssastSEx23XDklfPoCPIXD2QgGC7y39n/b5I9tOzKi2qYswCEAcDpwXYwevGOg==", - "peer": true, - "requires": { - "@react-native-community/cli-debugger-ui": "^5.0.1-alpha.1", - "@react-native-community/cli-hermes": "^5.0.1-alpha.1", - "@react-native-community/cli-server-api": "^5.0.1-alpha.2", - "@react-native-community/cli-tools": "^5.0.1-alpha.1", - "@react-native-community/cli-types": "^5.0.1-alpha.1", - "appdirsjs": "^1.2.4", - "chalk": "^3.0.0", - "command-exists": "^1.2.8", - "commander": "^2.19.0", - "cosmiconfig": "^5.1.0", - "deepmerge": "^3.2.0", - "envinfo": "^7.7.2", - "execa": "^1.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.3", - "graceful-fs": "^4.1.3", - "joi": "^17.2.1", - "leven": "^3.1.0", - "lodash": "^4.17.15", - "metro": "^0.64.0", - "metro-config": "^0.64.0", - "metro-core": "^0.64.0", - "metro-react-native-babel-transformer": "^0.64.0", - "metro-resolver": "^0.64.0", - "metro-runtime": "^0.64.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "node-stream-zip": "^1.9.1", - "ora": "^3.4.0", - "pretty-format": "^26.6.2", - "prompts": "^2.4.0", - "semver": "^6.3.0", - "serve-static": "^1.13.1", - "strip-ansi": "^5.2.0", - "sudo-prompt": "^9.0.0", - "wcwidth": "^1.0.1" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "peer": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true - }, - "react": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", - "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-native": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.64.0.tgz", - "integrity": "sha512-8dhSHBthgGwAjU+OjqUEA49229ThPMQH7URH0u8L0xoQFCnZO2sZ9Wc6KcbxI0x9KSmjCMFFZqRe3w3QsRv64g==", - "peer": true, - "requires": { - "@jest/create-cache-key-function": "^26.5.0", - "@react-native-community/cli": "^5.0.1-alpha.0", - "@react-native-community/cli-platform-android": "^5.0.1-alpha.0", - "@react-native-community/cli-platform-ios": "^5.0.1-alpha.0", - "@react-native/assets": "1.0.0", - "@react-native/normalize-color": "1.0.0", - "@react-native/polyfills": "1.0.0", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "base64-js": "^1.1.2", - "event-target-shim": "^5.0.1", - "hermes-engine": "~0.7.0", - "invariant": "^2.2.4", - "jsc-android": "^245459.0.0", - "metro-babel-register": "0.64.0", - "metro-react-native-babel-transformer": "0.64.0", - "metro-runtime": "0.64.0", - "metro-source-map": "0.64.0", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.0.3", - "prop-types": "^15.7.2", - "react-devtools-core": "^4.6.0", - "react-native-codegen": "^0.0.6", - "react-refresh": "^0.4.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "^0.20.1", - "shelljs": "^0.8.4", - "stacktrace-parser": "^0.1.3", - "use-subscription": "^1.0.0", - "whatwg-fetch": "^3.0.0", - "ws": "^6.1.4" - } - }, - "react-native-get-random-values": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/react-native-get-random-values/-/react-native-get-random-values-1.7.0.tgz", - "integrity": "sha512-zDhmpWUekGRFb9I+MQkxllHcqXN9HBSsgPwBQfrZ1KZYpzDspWLZ6/yLMMZrtq4pVqNR7C7N96L3SuLpXv1nhQ==", - "requires": { - "fast-base64-decode": "^1.0.0" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "peer": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "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==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", + "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==" + }, + "@babel/core": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", + "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-module-transforms": "^7.13.14", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.15", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.14", + "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" } }, - "@aws-sdk/middleware-sdk-s3": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.6.1.tgz", - "integrity": "sha512-HEA9kynNTsOSIIz8p5GEEAH03pnn+SSohwPl80sGqkmI1yl1tzjqgYZRii0e6acJTh4j9655XFzSx36hYPeB2w==", + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-arn-parser": "3.6.1", - "tslib": "^1.8.0" + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "@aws-sdk/middleware-serde": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.6.1.tgz", - "integrity": "sha512-EdQCFZRERfP3uDuWcPNuaa2WUR3qL1WFDXafhcx+7ywQxagdYqBUWKFJlLYi6njbkOKXFM+eHBzoXGF0OV3MJA==", + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "requires": { - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/types": "^7.12.13" } }, - "@aws-sdk/middleware-signing": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.6.1.tgz", - "integrity": "sha512-1woKq+1sU3eausdl8BNdAMRZMkSYuy4mxhLsF0/qAUuLwo1eJLLUCOQp477tICawgu4O4q2OAyUHk7wMqYnQCg==", + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/signature-v4": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@aws-sdk/middleware-ssec": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.6.1.tgz", - "integrity": "sha512-svuH6s91uKUTORt51msiL/ZBjtYSW32c3uVoWxludd/PEf6zO5wCmUEsKoyVwa88L7rrCq+81UBv5A8S5kc3Cw==", + "@babel/helper-compilation-targets": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", "requires": { - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" } }, - "@aws-sdk/middleware-stack": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.6.1.tgz", - "integrity": "sha512-EPsIxMi8LtCt7YwTFpWGlVGYJc0q4kwFbOssY02qfqdCnyqi2y5wo089dH7OdxUooQ0D7CPsXM1zTTuzvm+9Fw==", + "@babel/helper-create-class-features-plugin": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", "requires": { - "tslib": "^1.8.0" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" } }, - "@aws-sdk/middleware-user-agent": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.6.1.tgz", - "integrity": "sha512-YvXvwllNDVvxQ30vIqLsx+P6jjnfFEQUmhlv64n98gOme6h2BqoyQDcC3yHRGctuxRZEsR7W/H1ASTKC+iabbQ==", + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" } }, - "@aws-sdk/node-config-provider": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.6.1.tgz", - "integrity": "sha512-x2Z7lm0ZhHYqMybvkaI5hDKfBkaLaXhTDfgrLl9TmBZ3QHO4fIHgeL82VZ90Paol+OS+jdq2AheLmzbSxv3HrA==", + "@babel/helper-define-polyfill-provider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", "requires": { - "@aws-sdk/property-provider": "3.6.1", - "@aws-sdk/shared-ini-file-loader": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@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" } }, - "@aws-sdk/node-http-handler": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.6.1.tgz", - "integrity": "sha512-6XSaoqbm9ZF6T4UdBCcs/Gn2XclwBotkdjj46AxO+9vRAgZDP+lH/8WwZsvfqJhhRhS0qxWrks98WGJwmaTG8g==", + "@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "requires": { - "@aws-sdk/abort-controller": "3.6.1", - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/querystring-builder": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/types": "^7.13.0" } }, - "@aws-sdk/property-provider": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.6.1.tgz", - "integrity": "sha512-2gR2DzDySXKFoj9iXLm1TZBVSvFIikEPJsbRmAZx5RBY+tp1IXWqZM6PESjaLdLg/ZtR0QhW2ZcRn0fyq2JfnQ==", + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@aws-sdk/protocol-http": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.6.1.tgz", - "integrity": "sha512-WkQz7ncVYTLvCidDfXWouDzqxgSNPZDz3Bql+7VhZeITnzAEcr4hNMyEqMAVYBVugGmkG2W6YiUqNNs1goOcDA==", + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "requires": { - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/types": "^7.12.13" } }, - "@aws-sdk/querystring-builder": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.6.1.tgz", - "integrity": "sha512-ESe255Yl6vB1AMNqaGSQow3TBYYnpw0AFjE40q2VyiNrkbaqKmW2EzjeCy3wEmB1IfJDHy3O12ZOMUMOnjFT8g==", + "@babel/helper-hoist-variables": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", "requires": { - "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-uri-escape": "3.6.1", - "tslib": "^1.8.0" + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, - "@aws-sdk/querystring-parser": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.6.1.tgz", - "integrity": "sha512-hh6dhqamKrWWaDSuO2YULci0RGwJWygoy8hpCRxs/FpzzHIcbm6Cl6Jhrn5eKBzOBv+PhCcYwbfad0kIZZovcQ==", + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "requires": { - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/types": "^7.13.12" } }, - "@aws-sdk/s3-request-presigner": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.6.1.tgz", - "integrity": "sha512-OI7UHCKBwuiO/RmHHewBKnL2NYqdilXRmpX67TJ4tTszIrWP2+vpm3lIfrx/BM8nf8nKTzgkO98uFhoJsEhmTg==", + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "requires": { - "@aws-sdk/protocol-http": "3.6.1", - "@aws-sdk/signature-v4": "3.6.1", - "@aws-sdk/smithy-client": "3.6.1", - "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-create-request": "3.6.1", - "@aws-sdk/util-format-url": "3.6.1", - "tslib": "^1.8.0" + "@babel/types": "^7.13.12" } }, - "@aws-sdk/service-error-classification": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.6.1.tgz", - "integrity": "sha512-kZ7ZhbrN1f+vrSRkTJvXsu7BlOyZgym058nPA745+1RZ1Rtv4Ax8oknf2RvJyj/1qRUi8LBaAREjzQ3C8tmLBA==" + "@babel/helper-module-transforms": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "requires": { + "@babel/types": "^7.13.12" + } }, - "@aws-sdk/shared-ini-file-loader": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.6.1.tgz", - "integrity": "sha512-BnLHtsNLOoow6rPV+QVi6jnovU5g1m0YzoUG0BQYZ1ALyVlWVr0VvlUX30gMDfdYoPMp+DHvF8GXdMuGINq6kQ==", + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { - "tslib": "^1.8.0" + "@babel/types": "^7.12.1" } }, - "@aws-sdk/signature-v4": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.6.1.tgz", - "integrity": "sha512-EAR0qGVL4AgzodZv4t+BSuBfyOXhTNxDxom50IFI1MqidR9vI6avNZKcPHhgXbm7XVcsDGThZKbzQ2q7MZ2NTA==", + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@aws-sdk/is-array-buffer": "3.6.1", - "@aws-sdk/types": "3.6.1", - "@aws-sdk/util-hex-encoding": "3.6.1", - "@aws-sdk/util-uri-escape": "3.6.1", - "tslib": "^1.8.0" + "@babel/types": "^7.12.13" } }, - "@aws-sdk/smithy-client": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.6.1.tgz", - "integrity": "sha512-AVpRK4/iUxNeDdAm8UqP0ZgtgJMQeWcagTylijwelhWXyXzHUReY1sgILsWcdWnoy6gq845W7K2VBhBleni8+w==", + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + }, + "@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "requires": { - "@aws-sdk/middleware-stack": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, - "@aws-sdk/types": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.6.1.tgz", - "integrity": "sha512-4Dx3eRTrUHLxhFdLJL8zdNGzVsJfAxtxPYYGmIddUkO2Gj3WA1TGjdfG4XN/ClI6e1XonCHafQX3UYO/mgnH3g==" + "@babel/helpers": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } }, - "@aws-sdk/url-parser": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.6.1.tgz", - "integrity": "sha512-pWFIePDx0PMCleQRsQDWoDl17YiijOLj0ZobN39rQt+wv5PhLSZDz9PgJsqS48nZ6hqsKgipRcjiBMhn5NtFcQ==", + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "requires": { - "@aws-sdk/querystring-parser": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@aws-sdk/url-parser-native": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser-native/-/url-parser-native-3.6.1.tgz", - "integrity": "sha512-3O+ktsrJoE8YQCho9L41YXO8EWILXrSeES7amUaV3mgIV5w4S3SB/r4RkmylpqRpQF7Ry8LFiAnMqH1wa4WBPA==", + "@babel/parser": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", + "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", "requires": { - "@aws-sdk/querystring-parser": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0", - "url": "^0.11.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" } }, - "@aws-sdk/util-arn-parser": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.6.1.tgz", - "integrity": "sha512-NFdYeuhaSrgnBG6Pt3zHNU7QwvhHq6sKUTWZShUayLMJYYbQr6IjmYVlPST4c84b+lyDoK68y/Zga621VfIdBg==", + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", + "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", "requires": { - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, - "@aws-sdk/util-base64-browser": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.6.1.tgz", - "integrity": "sha512-+DHAIgt0AFARDVC7J0Z9FkSmJhBMlkYdOPeAAgO0WaQoKj7rtsLQJ7P3v3aS1paKN5/sk5xNY7ziVB6uHtOvHA==", + "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "requires": { - "tslib": "^1.8.0" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@aws-sdk/util-base64-node": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.6.1.tgz", - "integrity": "sha512-oiqzpsvtTSS92+cL3ykhGd7t3qBJKeHvrgOwUyEf1wFWHQ2DPJR+dIMy5rMFRXWLKCl3w7IddY2rJCkLYMjaqQ==", + "@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "requires": { - "@aws-sdk/util-buffer-from": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, - "@aws-sdk/util-body-length-browser": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.6.1.tgz", - "integrity": "sha512-IdWwE3rm/CFDk2F+IwTZOFTnnNW5SB8y1lWiQ54cfc7y03hO6jmXNnpZGZ5goHhT+vf1oheNQt1J47m0pM/Irw==", + "@babel/plugin-proposal-export-default-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.13.tgz", + "integrity": "sha512-idIsBT+DGXdOHL82U+8bwX4goHm/z10g8sGGrQroh+HCRcm7mDv/luaGdWJQMTuCX2FsdXS7X0Nyyzp4znAPJA==", + "peer": true, "requires": { - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-default-from": "^7.12.13" } }, - "@aws-sdk/util-body-length-node": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.6.1.tgz", - "integrity": "sha512-CUG3gc18bSOsqViQhB3M4AlLpAWV47RE6yWJ6rLD0J6/rSuzbwbjzxM39q0YTAVuSo/ivdbij+G9c3QCirC+QQ==", + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "requires": { - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, - "@aws-sdk/util-buffer-from": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.6.1.tgz", - "integrity": "sha512-OGUh2B5NY4h7iRabqeZ+EgsrzE1LUmNFzMyhoZv0tO4NExyfQjxIYXLQQvydeOq9DJUbCw+yrRZrj8vXNDQG+g==", + "@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "requires": { - "@aws-sdk/is-array-buffer": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, - "@aws-sdk/util-create-request": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.6.1.tgz", - "integrity": "sha512-jR1U8WpwXl+xZ9ThS42Jr5MXuegQ7QioHsZjQn3V5pbm8CXTkBF0B2BcULQu/2G1XtHOJb8qUZQlk/REoaORfQ==", + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", "requires": { - "@aws-sdk/middleware-stack": "3.6.1", - "@aws-sdk/smithy-client": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, - "@aws-sdk/util-format-url": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.6.1.tgz", - "integrity": "sha512-FvhcXcqLyJ0j0WdlmGs7PtjCCv8NaY4zBuXYO2iwAmqoy2SIZXQL63uAvmilqWj25q47ASAsUwSFLReCCfMklQ==", + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "requires": { - "@aws-sdk/querystring-builder": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, - "@aws-sdk/util-hex-encoding": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.6.1.tgz", - "integrity": "sha512-pzsGOHtU2eGca4NJgFg94lLaeXDOg8pcS9sVt4f9LmtUGbrqRveeyBv0XlkHeZW2n0IZBssPHipVYQFlk7iaRA==", + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "requires": { - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "@aws-sdk/util-locate-window": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.12.0.tgz", - "integrity": "sha512-hon4/fx/MKdDbajQGK/RVn9k+wtLtwIlJnys/yZs9swq4m7B1/JnlDqSwClxjiVnsbDlu95UcYclospSkHIWUw==", + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "requires": { - "tslib": "^1.8.0" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" } }, - "@aws-sdk/util-uri-escape": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.6.1.tgz", - "integrity": "sha512-tgABiT71r0ScRJZ1pMX0xO0QPMMiISCtumph50IU5VDyZWYgeIxqkMhIcrL1lX0QbNCMgX0n6rZxGrrbjDNavA==", + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "requires": { - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.6.1.tgz", - "integrity": "sha512-KhJ4VED4QpuBVPXoTjb5LqspX1xHWJTuL8hbPrKfxj+cAaRRW2CNEe7PPy2CfuHtPzP3dU3urtGTachbwNb0jg==", + "@babel/plugin-proposal-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", "requires": { - "@aws-sdk/types": "3.6.1", - "bowser": "^2.11.0", - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, - "@aws-sdk/util-user-agent-node": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.6.1.tgz", - "integrity": "sha512-PWwL5EDRwhkXX40m5jjgttlBmLA7vDhHBen1Jcle0RPIDFRVPSE7GgvLF3y4r3SNH0WD6hxqadT50bHQynXW6w==", + "@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "requires": { - "@aws-sdk/node-config-provider": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@aws-sdk/util-utf8-browser": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.6.1.tgz", - "integrity": "sha512-gZPySY6JU5gswnw3nGOEHl3tYE7vPKvtXGYoS2NRabfDKRejFvu+4/nNW6SSpoOxk6LSXsrWB39NO51k+G4PVA==", + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "requires": { - "tslib": "^1.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@aws-sdk/util-utf8-node": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.6.1.tgz", - "integrity": "sha512-4s0vYfMUn74XLn13rUUhNsmuPMh0j1d4rF58wXtjlVUU78THxonnN8mbCLC48fI3fKDHTmDDkeEqy7+IWP9VyA==", + "@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==", "requires": { - "@aws-sdk/util-buffer-from": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@aws-sdk/util-waiter": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.6.1.tgz", - "integrity": "sha512-CQMRteoxW1XZSzPBVrTsOTnfzsEGs8N/xZ8BuBnXLBjoIQmRKVxIH9lgphm1ohCtVHoSWf28XH/KoOPFULQ4Tg==", + "@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==", "requires": { - "@aws-sdk/abort-controller": "3.6.1", - "@aws-sdk/types": "3.6.1", - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@aws-sdk/xml-builder": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.6.1.tgz", - "integrity": "sha512-+HOCH4a0XO+I09okd0xdVP5Q5c9ZsEsDvnogiOcBQxoMivWhPUCo9pjXP3buCvVKP2oDHXQplBKSjGHvGaKFdg==", + "@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==", "requires": { - "tslib": "^1.8.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/code-frame": { + "@babel/plugin-syntax-export-default-from": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz", + "integrity": "sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ==", + "peer": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==" - }, - "@babel/core": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", - "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", + "@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==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.15", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.14", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "@babel/plugin-syntax-flow": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", + "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "peer": true, "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "@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==", "requires": { - "@babel/types": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/helper-builder-binary-assignment-operator-visitor": { + "@babel/plugin-syntax-jsx": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "@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==", "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "@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==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "@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==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/helper-define-polyfill-provider": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", - "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", + "@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==", "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" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "@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==", "requires": { - "@babel/types": "^7.13.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "@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==", "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/helper-get-function-arity": { + "@babel/plugin-syntax-top-level-await": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "requires": { - "@babel/types": "^7.12.13" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "@babel/plugin-syntax-typescript": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", + "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "peer": true, "requires": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "requires": { - "@babel/types": "^7.13.12" + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "requires": { - "@babel/types": "^7.13.12" + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" } }, - "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/helper-optimise-call-expression": { + "@babel/plugin-transform-block-scoping": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", "requires": { - "@babel/types": "^7.12.13" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - }, - "@babel/helper-remap-async-to-generator": { + "@babel/plugin-transform-classes": { "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "requires": { "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" } }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "@babel/plugin-transform-destructuring": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", "requires": { - "@babel/types": "^7.13.12" + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "requires": { - "@babel/types": "^7.12.1" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/helper-split-export-declaration": { + "@babel/plugin-transform-duplicate-keys": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "requires": { - "@babel/types": "^7.12.13" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "@babel/helper-wrap-function": { + "@babel/plugin-transform-flow-strip-types": { "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz", + "integrity": "sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==", + "peer": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-flow": "^7.12.13" } }, - "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/parser": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", - "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==" - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", - "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-proposal-class-properties": { + "@babel/plugin-transform-modules-amd": { "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@babel/plugin-proposal-dynamic-import": { + "@babel/plugin-transform-modules-commonjs": { "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "requires": { + "@babel/helper-module-transforms": "^7.13.0", "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@babel/plugin-proposal-export-default-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.13.tgz", - "integrity": "sha512-idIsBT+DGXdOHL82U+8bwX4goHm/z10g8sGGrQroh+HCRcm7mDv/luaGdWJQMTuCX2FsdXS7X0Nyyzp4znAPJA==", - "peer": true, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-export-default-from": "^7.12.13" + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "@babel/plugin-transform-modules-umd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.12.13" } }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "@babel/plugin-transform-object-assign": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz", + "integrity": "sha512-4QxDMc0lAOkIBSfCrnSGbAJ+4epDBF2XXwcLXuBcG1xl9u7LrktNVD4+LwhL47XuKVPQ7R25e/WdcV+h97HyZA==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-proposal-numeric-separator": { + "@babel/plugin-transform-object-super": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "requires": { "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-replace-supers": "^7.12.13" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "@babel/plugin-transform-react-display-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", + "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-proposal-optional-chaining": { + "@babel/plugin-transform-react-jsx": { "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", - "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" } }, - "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "@babel/plugin-transform-react-jsx-development": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", + "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/plugin-transform-react-jsx": "^7.12.17" } }, - "@babel/plugin-proposal-unicode-property-regex": { + "@babel/plugin-transform-react-jsx-self": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", + "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", + "peer": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", "@babel/helper-plugin-utils": "^7.12.13" } }, - "@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==", + "@babel/plugin-transform-react-jsx-source": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", + "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-syntax-class-properties": { + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", + "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { "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==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, - "@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==", + "@babel/plugin-transform-runtime": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz", + "integrity": "sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "semver": "^6.3.0" } }, - "@babel/plugin-syntax-export-default-from": { + "@babel/plugin-transform-shorthand-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz", - "integrity": "sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, - "@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==", + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, - "@babel/plugin-syntax-flow": { + "@babel/plugin-transform-sticky-regex": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, - "@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==", + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0" } }, - "@babel/plugin-syntax-jsx": { + "@babel/plugin-transform-typeof-symbol": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, - "@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==", + "@babel/plugin-transform-typescript": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", + "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-typescript": "^7.12.13" } }, - "@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==", + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@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==", + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@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==", + "@babel/preset-env": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz", + "integrity": "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/compat-data": "^7.13.15", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.15", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@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-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.14", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", + "semver": "^6.3.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==", + }, + "@babel/preset-flow": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.13.13.tgz", + "integrity": "sha512-MDtwtamMifqq3R2mC7l3A3uFalUb3NH5TIBQWjN/epEPlZktcLq4se3J+ivckKrLMGsR7H9LW8+pYuIUN9tsKg==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-flow-strip-types": "^7.13.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==", + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@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/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "@babel/preset-react": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", + "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-react-display-name": "^7.12.13", + "@babel/plugin-transform-react-jsx": "^7.13.12", + "@babel/plugin-transform-react-jsx-development": "^7.12.17", + "@babel/plugin-transform-react-pure-annotations": "^7.12.1" } }, - "@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "@babel/preset-typescript": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz", + "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==", "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-typescript": "^7.13.0" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "@babel/register": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.13.14.tgz", + "integrity": "sha512-iyw0hUwjh/fzN8qklVqZodbyWjEBOG0KdDnBOpv3zzIgK3NmuRXBmIXH39ZBdspkn8LTHvSboN+oYb4MT43+9Q==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.19", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "peer": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "peer": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "peer": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "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==", + "peer": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "peer": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "peer": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "peer": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true + } } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "regenerator-runtime": "^0.13.4" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "@babel/runtime-corejs3": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz", + "integrity": "sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "core-js-pure": "^3.19.0", + "regenerator-runtime": "^0.13.4" } }, - "@babel/plugin-transform-block-scoping": { + "@babel/template": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "@babel/traverse": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", + "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.15", + "@babel/types": "^7.13.14", + "debug": "^4.1.0", "globals": "^11.1.0" } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "@babel/types": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "peer": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "@eslint/eslintrc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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 + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - } + "@github/webauthn-json": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-0.4.5.tgz", + "integrity": "sha512-pVBGDtiHXPEK6Qycqt5yrHBfjpxlJ9MBMh5taKVosnvWNelwOtnwiXIOxVxFULwOtcZ0x65oIzh2Vz8oUq5tew==" }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz", - "integrity": "sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==", + "@hapi/hoek": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz", + "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==", + "peer": true + }, + "@hapi/topo": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", + "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-flow": "^7.12.13" + "@hapi/hoek": "^9.0.0" } }, - "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, - "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - } + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true }, - "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "@jest/create-cache-key-function": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-26.6.2.tgz", + "integrity": "sha512-LgEuqU1f/7WEIPYqwLPIvvHuc1sB6gMVbT6zWhin3txYUNYK/kGQrC1F2WR4gR34YlI9bBtViTm5z98RqVZAaw==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@jest/types": "^26.6.2" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.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==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "@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": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "@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": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "@popperjs/core": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", + "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==" + }, + "@react-native-community/cli-debugger-ui": { + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-5.0.1-alpha.1.tgz", + "integrity": "sha512-o6msDywXU7q0dPKhCTo8IrpmJ+7o+kVghyHlrAndnb30p6vnm4pID5Yi7lHXGfs6bQXorKUWX8oD5xYwWkN8qw==", + "peer": true, "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", - "babel-plugin-dynamic-import-node": "^2.3.3" + "serve-static": "^1.13.1" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "@react-native-community/cli-hermes": { + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-5.0.1-alpha.1.tgz", + "integrity": "sha512-7FNhqeZCbON4vhzZpV8nx4gB3COJy2KGbVku376CnIAjMncxJhupqORWdMukP8jNuuvUZ1R0vj0L0+W/M5rY1w==", + "peer": true, "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@react-native-community/cli-platform-android": "^5.0.1-alpha.1", + "@react-native-community/cli-tools": "^5.0.1-alpha.1", + "chalk": "^3.0.0", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "@react-native-community/cli-platform-android": { + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-5.0.1-alpha.1.tgz", + "integrity": "sha512-Fx9Tm0Z9sl5CD/VS8XWIY1gTgf28MMnAvyx0oj7yO4IzWuOpJPyWxTJITc80GAK6tlyijORv5kriYpXnquxQLg==", + "peer": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@react-native-community/cli-tools": "^5.0.1-alpha.1", + "chalk": "^3.0.0", + "execa": "^1.0.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.3", + "jetifier": "^1.6.2", + "lodash": "^4.17.15", + "logkitty": "^0.7.1", + "slash": "^3.0.0", + "xmldoc": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "@react-native-community/cli-platform-ios": { + "version": "5.0.1-alpha.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-5.0.1-alpha.2.tgz", + "integrity": "sha512-W15A75j+4bx6qbcapFia1A0M+W3JAt7Bc4VgEYvxDDRI62EsSHk1k6ZBNxs/j0cDPSYF9ZXHlRI+CWi3r9bTbQ==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@react-native-community/cli-tools": "^5.0.1-alpha.1", + "chalk": "^3.0.0", + "glob": "^7.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "plist": "^3.0.1", + "xcode": "^2.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==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@babel/plugin-transform-object-assign": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz", - "integrity": "sha512-4QxDMc0lAOkIBSfCrnSGbAJ+4epDBF2XXwcLXuBcG1xl9u7LrktNVD4+LwhL47XuKVPQ7R25e/WdcV+h97HyZA==", + "@react-native-community/cli-server-api": { + "version": "5.0.1-alpha.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-5.0.1-alpha.2.tgz", + "integrity": "sha512-qzjoLF51GmvUHQrcJZE+wD3bTmgnTNOnGBU6z4terKmPdt/EBBSUkdXc6ScWWRF6oWP+xpxLZ//tKic2v2f+ag==", "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@react-native-community/cli-debugger-ui": "^5.0.1-alpha.1", + "@react-native-community/cli-tools": "^5.0.1-alpha.1", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.0", + "nocache": "^2.1.0", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^1.1.0" + }, + "dependencies": { + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "peer": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + } } }, - "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "@react-native-community/cli-tools": { + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-5.0.1-alpha.1.tgz", + "integrity": "sha512-TwQxtfEOxGf8n5+UYKVO5exm56TwEAsWjYcoWkUKcSsIBl6VwCR4s3qGB8Y63uLUN2wf9MKnzvsaX337GjMVTA==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "chalk": "^3.0.0", + "lodash": "^4.17.15", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "shell-quote": "1.6.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==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": true + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "peer": 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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "@react-native-community/cli-types": { + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-5.0.1-alpha.1.tgz", + "integrity": "sha512-RdsLU0Jf3HodFnAY+oxCJt3VlhaN4MxGhfISvjGzqdjq3kpzmxex3+7fi6QvS97Kd6G2cheOJAdgP5wcwxp3Ng==", + "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "ora": "^3.4.0" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } + "@react-native/assets": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz", + "integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==", + "peer": true }, - "@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } + "@react-native/normalize-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz", + "integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg==", + "peer": true }, - "@babel/plugin-transform-react-jsx": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", - "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.13.12" - } + "@react-native/polyfills": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-1.0.0.tgz", + "integrity": "sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==", + "peer": true }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.12.17" - } + "@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", + "requires": {} }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", - "peer": true, + "@restart/hooks": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.26.tgz", + "integrity": "sha512-7Hwk2ZMYm+JLWcb7R9qIXk1OoUg1Z+saKWqZXlrvFwT3w6UArVNWgxYOzf+PJoK9zZejp8okPAKTctthhXLt5g==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "lodash": "^4.17.20", + "lodash-es": "^4.17.20" } }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", - "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", + "@sideway/address": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.1.tgz", + "integrity": "sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ==", "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@hapi/hoek": "^9.0.0" } }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "peer": true }, - "@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", - "requires": { - "regenerator-transform": "^0.14.2" - } + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "peer": true }, - "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "type-detect": "4.0.8" } }, - "@babel/plugin-transform-runtime": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz", - "integrity": "sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA==", + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "semver": "^6.3.0" + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" } }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" } }, - "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - } + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } + "@types/classnames": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.11.tgz", + "integrity": "sha512-2koNhpWm3DgWRp5tpkiJ8JGc1xTn2q0l+jUNUE7oMKXUf5NpI9AIdC4kbjGNFBdHtcxBD18LAksoudAVhFKCjw==" }, - "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - } + "@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@types/minimatch": "*", + "@types/node": "*" } }, - "@babel/plugin-transform-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", - "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "peer": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@types/node": "*" } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" } }, - "@babel/preset-env": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz", - "integrity": "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==", - "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.13.15", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@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-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.14", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", - "semver": "^6.3.0" + "@types/invariant": { + "version": "2.2.34", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", + "integrity": "sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "peer": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "peer": true, + "requires": { + "@types/istanbul-lib-coverage": "*" } }, - "@babel/preset-flow": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.13.13.tgz", - "integrity": "sha512-MDtwtamMifqq3R2mC7l3A3uFalUb3NH5TIBQWjN/epEPlZktcLq4se3J+ivckKrLMGsR7H9LW8+pYuIUN9tsKg==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "peer": true, "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-flow-strip-types": "^7.13.0" + "@types/istanbul-lib-report": "*" } }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "@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/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "@types/node": { + "version": "14.14.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz", + "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==" + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, + "@types/react": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", + "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", "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" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, - "@babel/preset-react": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", - "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", - "dev": true, + "@types/react-redux": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.16.tgz", + "integrity": "sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.13.12", - "@babel/plugin-transform-react-jsx-development": "^7.12.17", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" } }, - "@babel/preset-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz", - "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==", - "peer": true, + "@types/react-transition-group": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-typescript": "^7.13.0" + "@types/react": "*" } }, - "@babel/register": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.13.14.tgz", - "integrity": "sha512-iyw0hUwjh/fzN8qklVqZodbyWjEBOG0KdDnBOpv3zzIgK3NmuRXBmIXH39ZBdspkn8LTHvSboN+oYb4MT43+9Q==", + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, + "@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" + }, + "@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "peer": true, "requires": { - "find-cache-dir": "^2.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "peer": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", + "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.4.0", + "@typescript-eslint/scope-manager": "5.4.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "peer": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "peer": true, + "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": { - "locate-path": "^3.0.0" + "yallist": "^4.0.0" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "peer": true, + "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": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "lru-cache": "^6.0.0" } }, - "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==", - "peer": true, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", + "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/typescript-estree": "5.4.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "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": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", + "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/typescript-estree": "5.4.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", + "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/visitor-keys": "5.4.0" + } + }, + "@typescript-eslint/types": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", + "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", + "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/visitor-keys": "5.4.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.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 }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "peer": true, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, "requires": { - "p-limit": "^2.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "peer": true + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "peer": true, + "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": { - "find-up": "^3.0.0" + "yallist": "^4.0.0" } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true + "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" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, - "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "@typescript-eslint/visitor-keys": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", + "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.4.0", + "eslint-visitor-keys": "^3.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, "requires": { - "regenerator-runtime": "^0.13.4" + "@webassemblyjs/wast-printer": "1.9.0" } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@webassemblyjs/ast": "1.9.0" } }, - "@babel/traverse": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", - "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.15", - "@babel/types": "^7.13.14", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, - "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "@xtuc/ieee754": "^1.2.0" } }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "peer": true, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "@xtuc/long": "4.2.2" } }, - "@github/webauthn-json": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-0.4.5.tgz", - "integrity": "sha512-pVBGDtiHXPEK6Qycqt5yrHBfjpxlJ9MBMh5taKVosnvWNelwOtnwiXIOxVxFULwOtcZ0x65oIzh2Vz8oUq5tew==" + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true }, - "@hapi/hoek": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz", - "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==", - "peer": true + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } }, - "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", - "peer": true, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, "requires": { - "@hapi/hoek": "^9.0.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "@jest/create-cache-key-function": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-26.6.2.tgz", - "integrity": "sha512-LgEuqU1f/7WEIPYqwLPIvvHuc1sB6gMVbT6zWhin3txYUNYK/kGQrC1F2WR4gR34YlI9bBtViTm5z98RqVZAaw==", - "peer": true, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, "requires": { - "@jest/types": "^26.6.2" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "peer": true, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.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==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "@popperjs/core": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", - "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==" + "@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 }, - "@react-native-community/cli-debugger-ui": { - "version": "5.0.1-alpha.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-5.0.1-alpha.1.tgz", - "integrity": "sha512-o6msDywXU7q0dPKhCTo8IrpmJ+7o+kVghyHlrAndnb30p6vnm4pID5Yi7lHXGfs6bQXorKUWX8oD5xYwWkN8qw==", + "@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 + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "peer": true, "requires": { - "serve-static": "^1.13.1" + "event-target-shim": "^5.0.0" } }, - "@react-native-community/cli-hermes": { - "version": "5.0.1-alpha.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-5.0.1-alpha.1.tgz", - "integrity": "sha512-7FNhqeZCbON4vhzZpV8nx4gB3COJy2KGbVku376CnIAjMncxJhupqORWdMukP8jNuuvUZ1R0vj0L0+W/M5rY1w==", - "peer": true, + "absolute-path": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", + "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=", + "peer": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "@react-native-community/cli-platform-android": "^5.0.1-alpha.1", - "@react-native-community/cli-tools": "^5.0.1-alpha.1", - "chalk": "^3.0.0", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, - "@react-native-community/cli-platform-android": { - "version": "5.0.1-alpha.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-5.0.1-alpha.1.tgz", - "integrity": "sha512-Fx9Tm0Z9sl5CD/VS8XWIY1gTgf28MMnAvyx0oj7yO4IzWuOpJPyWxTJITc80GAK6tlyijORv5kriYpXnquxQLg==", - "peer": true, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "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": { - "@react-native-community/cli-tools": "^5.0.1-alpha.1", - "chalk": "^3.0.0", - "execa": "^1.0.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.3", - "jetifier": "^1.6.2", - "lodash": "^4.17.15", - "logkitty": "^0.7.1", - "slash": "^3.0.0", - "xmldoc": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "@react-native-community/cli-platform-ios": { - "version": "5.0.1-alpha.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-5.0.1-alpha.2.tgz", - "integrity": "sha512-W15A75j+4bx6qbcapFia1A0M+W3JAt7Bc4VgEYvxDDRI62EsSHk1k6ZBNxs/j0cDPSYF9ZXHlRI+CWi3r9bTbQ==", - "peer": true, - "requires": { - "@react-native-community/cli-tools": "^5.0.1-alpha.1", - "chalk": "^3.0.0", - "glob": "^7.1.3", - "js-yaml": "^3.13.1", - "lodash": "^4.17.15", - "plist": "^3.0.1", - "xcode": "^2.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==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": 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==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "requires": {} + }, + "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": {} + }, + "amazon-cognito-identity-js": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-4.6.0.tgz", + "integrity": "sha512-D62rs0mcfA4APccAAsliWh1beOU7MBu/xj21W0kSOsjdc9diujgLHwHiHN6z91HSmJvztf69PUq4w4KuVKEjCA==", + "requires": { + "buffer": "4.9.2", + "crypto-js": "^3.3.0", + "fast-base64-decode": "^1.0.0", + "isomorphic-unfetch": "^3.0.0", + "js-cookie": "^2.2.1" } }, - "@react-native-community/cli-server-api": { - "version": "5.0.1-alpha.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-5.0.1-alpha.2.tgz", - "integrity": "sha512-qzjoLF51GmvUHQrcJZE+wD3bTmgnTNOnGBU6z4terKmPdt/EBBSUkdXc6ScWWRF6oWP+xpxLZ//tKic2v2f+ag==", + "anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "peer": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", "peer": true, "requires": { - "@react-native-community/cli-debugger-ui": "^5.0.1-alpha.1", - "@react-native-community/cli-tools": "^5.0.1-alpha.1", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.0", - "nocache": "^2.1.0", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^1.1.0" + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "peer": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "peer": true, "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "ansi-regex": "^4.1.0" } } } }, - "@react-native-community/cli-tools": { - "version": "5.0.1-alpha.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-5.0.1-alpha.1.tgz", - "integrity": "sha512-TwQxtfEOxGf8n5+UYKVO5exm56TwEAsWjYcoWkUKcSsIBl6VwCR4s3qGB8Y63uLUN2wf9MKnzvsaX337GjMVTA==", + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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==", + "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==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "appdirsjs": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.4.tgz", + "integrity": "sha512-WO5StDORR6JF/xYnXk/Fm0yu+iULaV5ULKuUw0Tu+jbgiTlSquaWBCgbpnsHLMXldf+fM3Gxn5p7vjond7He6w==", + "peer": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "peer": true, "requires": { - "chalk": "^3.0.0", - "lodash": "^4.17.15", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "shell-quote": "1.6.1" + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "peer": true + }, + "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-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=" + }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "peer": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "peer": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "array.prototype.flatmap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "peer": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.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==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": 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==", - "peer": 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==", - "peer": true - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "peer": true + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "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==", - "peer": true, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, "requires": { - "has-flag": "^4.0.0" + "inherits": "2.0.1" } } } }, - "@react-native-community/cli-types": { - "version": "5.0.1-alpha.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-5.0.1-alpha.1.tgz", - "integrity": "sha512-RdsLU0Jf3HodFnAY+oxCJt3VlhaN4MxGhfISvjGzqdjq3kpzmxex3+7fi6QvS97Kd6G2cheOJAdgP5wcwxp3Ng==", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", "peer": true, "requires": { - "ora": "^3.4.0" + "tslib": "^2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "peer": true + } } }, - "@react-native/assets": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz", - "integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==", - "peer": true - }, - "@react-native/normalize-color": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz", - "integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg==", - "peer": true + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true }, - "@react-native/polyfills": { + "astral-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-1.0.0.tgz", - "integrity": "sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "peer": true }, - "@restart/context": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", - "requires": {} - }, - "@restart/hooks": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.26.tgz", - "integrity": "sha512-7Hwk2ZMYm+JLWcb7R9qIXk1OoUg1Z+saKWqZXlrvFwT3w6UArVNWgxYOzf+PJoK9zZejp8okPAKTctthhXLt5g==", + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "lodash": "^4.17.20", - "lodash-es": "^4.17.20" + "lodash": "^4.17.14" } }, - "@sideway/address": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.1.tgz", - "integrity": "sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ==", - "peer": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "peer": true + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "peer": true + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "aws-amplify": { + "version": "3.3.27", + "resolved": "https://registry.npmjs.org/aws-amplify/-/aws-amplify-3.3.27.tgz", + "integrity": "sha512-3roZdw59ss5C5hjEzZH4+OTRjuQURGOmgEFEcygcHqEHSVmGsH42+cRLD32H9ACMN+YfC0DvZ5gHoMuybRj1vg==", "requires": { - "type-detect": "4.0.8" + "@aws-amplify/analytics": "4.0.18", + "@aws-amplify/api": "3.2.30", + "@aws-amplify/auth": "3.4.30", + "@aws-amplify/cache": "3.1.55", + "@aws-amplify/core": "3.8.22", + "@aws-amplify/datastore": "2.9.16", + "@aws-amplify/interactions": "3.3.30", + "@aws-amplify/predictions": "3.2.30", + "@aws-amplify/pubsub": "3.2.28", + "@aws-amplify/storage": "3.4.0", + "@aws-amplify/ui": "2.0.2", + "@aws-amplify/xr": "2.2.30" } }, - "@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } + "axe-core": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", + "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", + "dev": true }, - "@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "axios": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", + "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", "requires": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" + "follow-redirects": "^1.10.0" } }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==" - }, - "@types/classnames": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.11.tgz", - "integrity": "sha512-2koNhpWm3DgWRp5tpkiJ8JGc1xTn2q0l+jUNUE7oMKXUf5NpI9AIdC4kbjGNFBdHtcxBD18LAksoudAVhFKCjw==" + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true }, - "@types/cookie": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", - "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "peer": true, + "requires": {} }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "dev": true, "requires": { - "@types/minimatch": "*", - "@types/node": "*" + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" } }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "peer": true, + "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==", "requires": { - "@types/node": "*" + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.0", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" } }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "babel-plugin-polyfill-regenerator": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" + "@babel/helper-define-polyfill-provider": "^0.2.0" } }, - "@types/invariant": { - "version": "2.2.34", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", - "integrity": "sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", "peer": true }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "babel-preset-fbjs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", + "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", "peer": true, "requires": { - "@types/istanbul-lib-coverage": "*" + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" } }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "peer": true, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { - "@types/istanbul-lib-report": "*" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } } }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "peer": 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 }, - "@types/node": { - "version": "14.14.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz", - "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==" + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "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, + "optional": true }, - "@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "file-uri-to-path": "1.0.0" } }, - "@types/react-redux": { - "version": "7.1.16", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.16.tgz", - "integrity": "sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw==", + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, "requires": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "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 + } } }, - "@types/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==", + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, "requires": { - "@types/react": "*" + "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" } }, - "@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true }, - "@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" + "bootstrap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==", + "requires": {} }, - "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", "peer": true, "requires": { - "@types/yargs-parser": "*" + "stream-buffers": "~2.2.0" } }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "peer": true - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "peer": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "big-integer": "^1.6.44" } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.9.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { - "@xtuc/ieee754": "^1.2.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "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 + } } }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "@xtuc/long": "4.2.2" + "pako": "~1.0.5" } }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true + "browserslist": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz", + "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==", + "requires": { + "caniuse-lite": "^1.0.30001208", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.712", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "peer": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "node-int64": "^0.4.0" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "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 + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "peer": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" + "callsites": "^2.0.0" } }, - "@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 - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "peer": true, "requires": { - "event-target-shim": "^5.0.0" + "caller-callsite": "^2.0.0" } }, - "absolute-path": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", - "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=", + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "peer": true }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "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" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "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": {} + "caniuse-lite": { + "version": "1.0.30001209", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001209.tgz", + "integrity": "sha512-2Ktt4OeRM7EM/JaOZjuLzPYAIqmbwQMNnYbgooT+icoRGrKOyAxA1xhlnotBD1KArRSPsuJp3TdYcZYrL7qNxA==" }, - "amazon-cognito-identity-js": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-4.6.0.tgz", - "integrity": "sha512-D62rs0mcfA4APccAAsliWh1beOU7MBu/xj21W0kSOsjdc9diujgLHwHiHN6z91HSmJvztf69PUq4w4KuVKEjCA==", + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "peer": true, "requires": { - "buffer": "4.9.2", - "crypto-js": "^3.3.0", - "fast-base64-decode": "^1.0.0", - "isomorphic-unfetch": "^3.0.0", - "js-cookie": "^2.2.1" + "rsvp": "^4.8.4" } }, - "anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "peer": true + "cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "requires": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + } }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } }, - "ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "peer": true, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "optional": true, "requires": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "peer": true + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "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, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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, + "optional": true }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "peer": 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, + "optional": true, "requires": { - "ansi-regex": "^4.1.0" + "is-number": "^7.0.0" } } } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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 }, - "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==", - "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==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "appdirsjs": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.4.tgz", - "integrity": "sha512-WO5StDORR6JF/xYnXk/Fm0yu+iULaV5ULKuUw0Tu+jbgiTlSquaWBCgbpnsHLMXldf+fM3Gxn5p7vjond7He6w==", + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "peer": true }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "peer": true, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "peer": true - }, - "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-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=" - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "peer": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "peer": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { - "array-uniq": "^1.0.1" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "peer": true + "classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "source-map": "~0.6.0" }, "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "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 } } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "peer": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "peer": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "inherits": "2.0.1" + "ansi-regex": "^4.1.0" } } } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "peer": true, - "requires": { - "tslib": "^2.0.1" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "peer": true - } - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "peer": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "aws-amplify": { - "version": "3.3.27", - "resolved": "https://registry.npmjs.org/aws-amplify/-/aws-amplify-3.3.27.tgz", - "integrity": "sha512-3roZdw59ss5C5hjEzZH4+OTRjuQURGOmgEFEcygcHqEHSVmGsH42+cRLD32H9ACMN+YfC0DvZ5gHoMuybRj1vg==", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "@aws-amplify/analytics": "4.0.18", - "@aws-amplify/api": "3.2.30", - "@aws-amplify/auth": "3.4.30", - "@aws-amplify/cache": "3.1.55", - "@aws-amplify/core": "3.8.22", - "@aws-amplify/datastore": "2.9.16", - "@aws-amplify/interactions": "3.3.30", - "@aws-amplify/predictions": "3.2.30", - "@aws-amplify/pubsub": "3.2.28", - "@aws-amplify/storage": "3.4.0", - "@aws-amplify/ui": "2.0.2", - "@aws-amplify/xr": "2.2.30" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "axios": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", - "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "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==", "requires": { - "follow-redirects": "^1.10.0" + "color-name": "1.1.3" } }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "peer": true, - "requires": {} + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - } + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, - "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==", - "requires": { - "object.assign": "^4.1.0" - } + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "peer": true }, - "babel-plugin-polyfill-corejs2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", - "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.0", - "semver": "^6.1.1" - } + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "peer": true }, - "babel-plugin-polyfill-corejs3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", - "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.0", - "core-js-compat": "^3.9.1" - } + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true }, - "babel-plugin-polyfill-regenerator": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", - "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.0" - } + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "peer": 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==" }, - "babel-preset-fbjs": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", - "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", - "peer": true, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + "mime-db": ">= 1.43.0 < 2" } }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "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": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "is-descriptor": "^1.0.0" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "peer": 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 - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" - }, - "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, - "optional": true + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, - "optional": true, "requires": { - "file-uri-to-path": "1.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "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" + } + } } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", "dev": true }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "peer": true, "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "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, + "peer": true, "requires": { "ms": "2.0.0" } @@ -20339,700 +23531,610 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "peer": 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=", + "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 }, - "bootstrap": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", - "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==", - "requires": {} + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true }, - "bplist-creator": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", - "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", - "peer": true, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, "requires": { - "stream-buffers": "~2.2.0" + "safe-buffer": "5.1.2" } }, - "bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "peer": 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.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { - "big-integer": "^1.6.44" + "safe-buffer": "~5.1.1" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "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-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js-compat": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.1.tgz", + "integrity": "sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "browserslist": "^4.16.3", + "semver": "7.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "core-js-pure": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz", + "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "peer": true, "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "^1.0.1", - "des.js": "^1.0.0", "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "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 + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "pako": "~1.0.5" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "browserslist": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz", - "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==", - "requires": { - "caniuse-lite": "^1.0.30001208", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.712", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "peer": true, + "css-loader": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.4.tgz", + "integrity": "sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw==", + "dev": true, "requires": { - "node-int64": "^0.4.0" + "camelcase": "^6.2.0", + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.10", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.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" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "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" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "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==", + "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 }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "csstype": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", + "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", "dev": true }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "dayjs": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", + "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==", + "peer": true }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "ms": "2.1.2" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.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=" }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "peer": true, - "requires": { - "callsites": "^2.0.0" - } + "deep-diff": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", + "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "peer": 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": { - "caller-callsite": "^2.0.0" + "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" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", "peer": true }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-lite": { - "version": "1.0.30001209", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001209.tgz", - "integrity": "sha512-2Ktt4OeRM7EM/JaOZjuLzPYAIqmbwQMNnYbgooT+icoRGrKOyAxA1xhlnotBD1KArRSPsuJp3TdYcZYrL7qNxA==" - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "peer": true, "requires": { - "rsvp": "^4.8.4" - } - }, - "cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "requires": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "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, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "optional": 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, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } + "clone": "^1.0.2" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "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==", + "requires": { + "object-keys": "^1.0.12" + } }, - "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 + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", "peer": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "minimalistic-assert": "^1.0.0" } }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "detect-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", + "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "source-map": "~0.6.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.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==", + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "peer": 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": { - "restore-cursor": "^2.0.0" + "path-type": "^4.0.0" } }, - "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", - "peer": true + "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 }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "peer": true + "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" + } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" } }, - "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==", + "dom-helpers": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", + "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", "requires": { - "color-name": "1.1.3" + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "peer": true - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "peer": true + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "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==" + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, "requires": { - "mime-db": ">= 1.43.0 < 2" + "domelementtype": "1" } }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "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": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "dom-serializer": "0", + "domelementtype": "1" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, "dependencies": { "readable-stream": { @@ -21056,152 +24158,34 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "peer": 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==", - "peer": 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=", - "peer": 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-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "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.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "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==" - }, - "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-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js-compat": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.1.tgz", - "integrity": "sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg==", - "requires": { - "browserslist": "^4.16.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + "safe-buffer": "~5.1.0" + } } } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "peer": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } + "electron-to-chromium": { + "version": "1.3.717", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz", + "integrity": "sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==" }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { @@ -21212,688 +24196,773 @@ } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "once": "^1.4.0" } }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - }, - "css-loader": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.4.tgz", - "integrity": "sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw==", + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dev": true, "requires": { - "camelcase": "^6.2.0", - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.10", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" }, "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.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==", + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, "requires": { - "yallist": "^4.0.0" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "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": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "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" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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": { - "lru-cache": "^6.0.0" + "safe-buffer": "~5.1.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "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 - }, - "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dayjs": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", - "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==", - "peer": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" + } } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "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=" - }, - "deep-diff": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" - }, - "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==", + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "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" + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "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 + } } }, - "deepmerge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "peer": true }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "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, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "prr": "~1.0.1" } }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "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==", "peer": true, "requires": { - "clone": "^1.0.2" + "is-arrayish": "^0.2.1" } }, - "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==", + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "peer": true, "requires": { - "object-keys": "^1.0.12" + "stackframe": "^1.1.1" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "peer": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "accepts": "~1.3.7", + "escape-html": "~1.0.3" } }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" } }, - "denodeify": { + "es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "peer": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "detect-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", - "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==", - "dev": true + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "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=" }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "eslint": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", + "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "@eslint/eslintrc": "^1.0.4", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.1.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "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": "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" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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 + }, + "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" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "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" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + }, + "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" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "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" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, - "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.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "eslint-config-airbnb": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.1.tgz", + "integrity": "sha512-ooV8Vdt3gmV6hCSJutRw5beArd56Cd++vvy7j0Y7DBhUKqcTyI7cWNcJpCJlcftGPRLtzdU0hNMtquOUSSm8nA==", "dev": true, "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" } }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, "requires": { - "buffer-indexof": "^1.0.0" + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" } }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-helpers": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", - "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } + "requires": {} }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "debug": "^3.2.7", + "resolve": "^1.20.0" }, "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true + "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" + } } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.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==", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "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" + "ms": "^2.1.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==", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "locate-path": "^2.0.0" } - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.717", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz", - "integrity": "sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==" - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "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=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } } }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "eslint-plugin-import": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", + "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.1", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" }, "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "ms": "2.0.0" } }, - "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==", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "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" + "esutils": "^2.0.2" } }, - "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" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "peer": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "eslint-plugin-jsx-a11y": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz", + "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==", "dev": true, "requires": { - "prr": "~1.0.1" + "@babel/runtime": "^7.16.3", + "aria-query": "^4.2.2", + "array-includes": "^3.1.4", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.3.5", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + } } }, - "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==", - "peer": true, + "eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "prettier-linter-helpers": "^1.0.0" } }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "peer": true, + "eslint-plugin-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", + "integrity": "sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==", + "dev": true, "requires": { - "stackframe": "^1.1.1" + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } } }, - "errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "peer": true, - "requires": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - } + "eslint-plugin-react-hooks": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", + "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "dev": true, + "requires": {} }, - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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=" + "eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "espree": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", + "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "acorn": "^8.6.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + }, + "dependencies": { + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + } } }, "esprima": { @@ -21902,6 +24971,23 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "peer": true }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.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 + } + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -22211,38 +25297,117 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" + }, + "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-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" } } }, - "fast-base64-decode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", - "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" - }, - "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-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 }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fast-xml-parser": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" }, + "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.3", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", @@ -22267,6 +25432,15 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -22361,6 +25535,33 @@ "resolve-dir": "^1.0.1" } }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, "flow-parser": { "version": "0.121.0", "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", @@ -22533,6 +25734,12 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -22561,6 +25768,16 @@ "pump": "^3.0.0" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -22584,7 +25801,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "optional": true, "requires": { "is-glob": "^4.0.1" } @@ -22678,6 +25894,15 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, + "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-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -23026,6 +26251,12 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "image-size": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", @@ -23143,6 +26374,17 @@ "ipaddr.js": "^1.9.0" } }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -23233,9 +26475,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, "is-ci": { @@ -23248,9 +26490,9 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "requires": { "has": "^1.0.3" } @@ -23305,9 +26547,9 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "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" @@ -23376,25 +26618,34 @@ } }, "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "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-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-symbol": { "version": "1.0.3", @@ -23405,6 +26656,15 @@ "has-symbols": "^1.0.1" } }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -23834,6 +27094,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json3": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", @@ -23863,6 +27129,16 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "peer": true }, + "jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + } + }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -23894,12 +27170,37 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "peer": true }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "peer": true }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -23951,6 +27252,12 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -24222,6 +27529,12 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "peer": 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", @@ -24732,6 +28045,7 @@ "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", "peer": true, "requires": { + "@babel/core": "^7.0.0", "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", @@ -24778,6 +28092,7 @@ "integrity": "sha512-K1sHO3ODBFCr7uEiCQ4RvVr+cQg0EHQF8ChVPnecGh/WDD8udrTq9ECwB0dRfMjAvlsHtRUlJm6ZSI8UPgum2w==", "peer": true, "requires": { + "@babel/core": "^7.0.0", "babel-preset-fbjs": "^3.3.0", "metro-babel-transformer": "0.64.0", "metro-react-native-babel-preset": "0.64.0", @@ -25061,6 +28376,12 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -25340,9 +28661,9 @@ } }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true }, "object-is": { @@ -25379,6 +28700,28 @@ "object-keys": "^1.1.1" } }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "object.getownpropertydescriptors": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", @@ -25390,6 +28733,16 @@ "es-abstract": "^1.18.0-next.2" } }, + "object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -25398,6 +28751,17 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -25452,6 +28816,20 @@ "is-wsl": "^1.1.0" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "options": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", @@ -25608,6 +28986,23 @@ "no-case": "^2.2.0" } }, + "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" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", @@ -25710,6 +29105,12 @@ } } }, + "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 + }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -25881,6 +29282,27 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", @@ -25952,6 +29374,12 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -26095,6 +29523,12 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "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", @@ -26430,6 +29864,12 @@ "define-properties": "^1.1.3" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "regexpu-core": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", @@ -26603,6 +30043,12 @@ "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 + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -26627,6 +30073,15 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "peer": 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" + } + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -26951,6 +30406,17 @@ "rechoir": "^0.6.2" } }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -26990,8 +30456,7 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "peer": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { "version": "2.1.0", @@ -27506,6 +30971,22 @@ } } }, + "string.prototype.matchall": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", + "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -27535,11 +31016,23 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "style-loader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", @@ -27750,6 +31243,12 @@ } } }, + "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 + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -27880,17 +31379,58 @@ "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", "dev": true }, + "tsconfig-paths": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", + "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "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" + } + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -27918,6 +31458,13 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "dev": true, + "peer": true + }, "uglify-es": { "version": "3.3.9", "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", @@ -28818,6 +32365,12 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/clients/web/react/package.json b/clients/web/react/package.json index f394b5d..d162c89 100755 --- a/clients/web/react/package.json +++ b/clients/web/react/package.json @@ -31,10 +31,21 @@ "@babel/preset-env": "^7.12.1", "@babel/preset-react": "^7.12.1", "@babel/runtime": "^7.12.1", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", "babel-loader": "^8.1.0", "css-loader": "^5.2.4", + "eslint": "^8.3.0", + "eslint-config-airbnb": "^19.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", "html-webpack-plugin": "^3.2.0", "path": "^0.12.7", + "prettier": "^2.4.1", "style-loader": "^2.0.0", "webpack": "^4.44.2", "webpack-cli": "^3.3.12", From ad1651e2e3d9fb2bc89c89d360530aaa1b1a43a9 Mon Sep 17 00:00:00 2001 From: csalas Date: Wed, 24 Nov 2021 15:37:57 -0700 Subject: [PATCH 22/66] Began to integrate new home page, Show keys, recvoery codes, delete user, and sign out working, but wonky --- clients/web/react/src/HomePage/HomePage.jsx | 232 ++++++++++-------- clients/web/react/src/HomePage/index.js | 4 +- .../_components/Credential/AddCredential.jsx | 123 +++++----- .../src/_components/Credential/Credential.jsx | 34 ++- .../_components/Credential/CredentialList.jsx | 36 ++- .../_components/Credential/EditCredential.jsx | 89 +++---- .../react/src/_components/Credential/index.js | 2 +- .../src/_components/DeleteUser/DeleteUser.jsx | 118 +++++---- .../RecoveryCodes/RecoveryCodes.jsx | 43 ++-- 9 files changed, 346 insertions(+), 335 deletions(-) diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 64a8b04..8b32eda 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -1,109 +1,117 @@ -import React, { useState, useEffect } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; +import React, { useEffect } from "react"; +import { Link } from "react-router-dom"; +import { useDispatch, useSelector } from "react-redux"; +import { Button, Card, InputGroup, FormControl, Table } from "react-bootstrap"; +import { Auth } from "aws-amplify"; +import { userActions, credentialActions } from "../_actions"; +import { history } from "../_helpers"; +import CredentialList from "../_components/Credential/CredentialList"; +import { RecoveryCodes } from "../_components/RecoveryCodes/RecoveryCodes"; +import { DeleteUser } from "../_components/DeleteUser/DeleteUser"; -import { userActions, credentialActions, alertActions } from '../_actions'; -import { CredentialList } from '../_components/Credential'; -import { RecoveryCodes } from '../_components/RecoveryCodes'; -import { DeleteUser } from '../_components/DeleteUser'; +const HomePage = function () { + const authentication = useSelector((state) => state.authentication); + const credentials = useSelector((state) => state.credentials); + const alert = useSelector((state) => state.alert); -import { Button, InputGroup, Card, Table, FormControl } from 'react-bootstrap'; -import { Auth } from 'aws-amplify'; -import axios from 'axios'; -import aws_exports from '../aws-exports'; -import validate from 'validate.js'; + const dispatch = useDispatch(); -axios.defaults.baseURL = aws_exports.apiEndpoint; + function currentAuthenticatedUser() { + dispatch(userActions.getCurrentAuthenticatedUser()); + } -function HomePage() { - - const [userInfo, setUserInfo] = useState({ - id: "", - username: "", - credential: "", - token: '' - }); - const credentials = useSelector(state => state.credentials); - const alert = useSelector(state => state.alert); - const svpinChangeProps = {type: "change", saveCallback: updatePin}; - const dispatch = useDispatch(); - - //To re-evaluate later - function updatePin(fields) { - dispatch(credentialActions.updatePin(fields)); + useEffect(() => { + if (authentication.user.token) { + dispatch(credentialActions.getAll(authentication.user.token)); } + }, [authentication, alert]); - useEffect(() => { - currentAuthenticatedUser(); - }, []); - - useEffect(() => { - if(userInfo.token) { - dispatch(credentialActions.getAll(userInfo.token)); - } - }, [alert]); - - function currentAuthenticatedUser() { - const currAuthUser = (dispatch(userActions.getCurrentAuthenticatedUser) || undefined); - console.log("Home currentAuthenticatedUser: ", currAuthUser) + useEffect(() => { + currentAuthenticatedUser(); + }, []); - if (currAuthUser === undefined) { - console.error("Home currentAuthenticatedUser error"); - dispatch(alertActions.error("Something went wrong. Please try again.")); - } else { - dispatch(alertActions.success('Home currentAuthenticatedUser successful')); - setUserInfo(currAuthUser); - dispatch(credentialActions.getAll(userInfo.token)); - } - } - - const logout = () => { - Auth.signOut(); - navigation.go('LogOutStep'); + const logOut = async () => { + try { + await Auth.signOut(); + } catch (error) { + console.log("error signing out: ", error); } + history.push("/login"); + }; - //Review - return ( - <> -
-

Account Security

-
-
- -
Trusted Devices
- - - - - - - - - - - - - - - - - - - -
Safari on macOS. Registered: May 26, 2021
Safari on macOS. Registered: April 26, 2021
Safari on macOS. Registered: March 26, 2021
-
-
- -
Security Keys
- - - -
- -
Server Verified PIN
- + return ( + <> +

Account Security

+
+ + +
Trusted Devices
+
+ + + + + + + + + + + + + + + + + + + +
+ + Safari on macOS. Registered: May 26, 2021 + {" "} + +
+ + Safari on macOS. Registered: April 26, 2021 + {" "} + +
+ + Safari on macOS. Registered: March 26, 2021 + {" "} + +
+
+
+ {credentials.items && ( + + )} + + +
Server Verified PIN
+
+ - Old PIN         + + Old PIN         + - New PIN       + + New PIN       + - -
+ + + {!credentials.loading && credentials.items && ( - -
-
-
-
-
Log Out
-
+ )} + {authentication.user.token && ( + + )} +
+
+
+
+
+
- ); -} + ); +}; -export { HomePage }; \ No newline at end of file +export default HomePage; diff --git a/clients/web/react/src/HomePage/index.js b/clients/web/react/src/HomePage/index.js index 17bea76..13792be 100644 --- a/clients/web/react/src/HomePage/index.js +++ b/clients/web/react/src/HomePage/index.js @@ -1 +1,3 @@ -export * from './HomePage'; \ No newline at end of file +import HomePage from "./HomePage"; + +export default HomePage; diff --git a/clients/web/react/src/_components/Credential/AddCredential.jsx b/clients/web/react/src/_components/Credential/AddCredential.jsx index 4c40b97..ef5f758 100644 --- a/clients/web/react/src/_components/Credential/AddCredential.jsx +++ b/clients/web/react/src/_components/Credential/AddCredential.jsx @@ -1,28 +1,34 @@ -import React, { useState, useRef } from 'react'; - -import { credentialActions, alertActions } from '../../_actions'; - -import { create } from '@github/webauthn-json'; -import { Button, Modal, Alert } from 'react-bootstrap'; -import base64url from 'base64url'; -import cbor from 'cbor'; -import axios from 'axios'; -import validate from 'validate.js'; - +import React, { useState, useRef } from "react"; + +import { create } from "@github/webauthn-json"; +import { Button, Modal, Alert } from "react-bootstrap"; +import base64url from "base64url"; +import cbor from "cbor"; +import axios from "axios"; +import validate from "validate.js"; +import { useDispatch } from "react-redux"; +import { credentialActions, alertActions } from "../../_actions"; +// eslint-disable-next-line camelcase +import aws_exports from "../../aws-exports"; + +// eslint-disable-next-line camelcase axios.defaults.baseURL = aws_exports.apiEndpoint; -function AddCredential() { +const AddCredential = function () { const [showAdd, setShowAdd] = useState(false); - const [nickname, setNickname] = useState(''); + const [nickname, setNickname] = useState(""); const [isResidentKey, setIsResidentKey] = useState(false); const [invalidNickname, setInvalidNickname] = useState(undefined); const [submitted, setSubmitted] = useState(false); + const dispatch = useDispatch(); + const handleClose = () => setShowAdd(false); const handleShow = () => { - setNickname(''); + setNickname(""); setShowAdd(true); }; - var constraints = { + const defaultInvalidPIN = -1; + const constraints = { nickname: { length: { maximum: 20, @@ -33,9 +39,9 @@ function AddCredential() { const handleSaveAdd = () => { setSubmitted(true); - let result = validate({ nickname: nickname }, constraints); + const result = validate({ nickname }, constraints); if (result) { - setInvalidNickname(result.nickname.join('. ')); + setInvalidNickname(result.nickname.join(". ")); } else { setInvalidNickname(undefined); setShowAdd(false); @@ -44,19 +50,19 @@ function AddCredential() { }; const handleCheckboxChange = (e) => { - const target = e.target; - const value = target.type === 'checkbox' ? target.checked : target.value; + const { target } = e; + const value = target.type === "checkbox" ? target.checked : target.value; setIsResidentKey(value); }; function getUV(attestationObject) { - let attestationBuffer = base64url.toBuffer(attestationObject); - let attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; - let buffer = attestationStruct.authData; + const attestationBuffer = base64url.toBuffer(attestationObject); + const attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; + const buffer = attestationStruct.authData; - let flagsBuf = buffer.slice(32, 33); - let flagsInt = flagsBuf[0]; - let flags = { + const flagsBuf = buffer.slice(32, 33); + const flagsInt = flagsBuf[0]; + const flags = { up: !!(flagsInt & 0x01), uv: !!(flagsInt & 0x04), at: !!(flagsInt & 0x40), @@ -67,48 +73,49 @@ function AddCredential() { } const register = () => { - console.log('register'); - console.log('nickname: ', nickname); + console.log("register"); + console.log("nickname: ", nickname); axios - .post('/users/credentials/fido2/register', { - nickname: nickname, + .post("/users/credentials/fido2/register", { + nickname, requireResidentKey: isResidentKey, }) .then((startRegistrationResponse) => { console.log(startRegistrationResponse); - const requestId = startRegistrationResponse.data.requestId; + const { requestId } = startRegistrationResponse.data; - let publicKey = { + const publicKey = { publicKey: startRegistrationResponse.data.publicKeyCredentialCreationOptions, }; - console.log('publlicKey: ', publicKey); + console.log("publlicKey: ", publicKey); create(publicKey) .then((makeCredentialResponse) => { console.log( - 'make credential response: ' + - JSON.stringify(makeCredentialResponse) + `make credential response: ${JSON.stringify( + makeCredentialResponse + )}` ); - let uv = getUV(makeCredentialResponse.response.attestationObject); - console.log('uv: ', uv); + const uv = getUV(makeCredentialResponse.response.attestationObject); + console.log("uv: ", uv); - let challengeResponse = { + const challengeResponse = { credential: makeCredentialResponse, - requestId: requestId, + requestId, pinSet: startRegistrationResponse.data.pinSet, pinCode: defaultInvalidPIN, - nickname: nickname, + nickname, }; - console.log('challengeResponse: ', challengeResponse); + console.log("challengeResponse: ", challengeResponse); if (uv === true) { if (uv === true) { - console.log('finishRegistration: ', challengeResponse); + console.log("finishRegistration: ", challengeResponse); dispatch(credentialActions.registerFinish(challengeResponse)); } else { dispatch(credentialActions.getUV(challengeResponse)); @@ -126,6 +133,11 @@ function AddCredential() { }); }; + const handleChange = (e) => { + const { name, value } = e.target; + setNickname(value); + }; + const inputRef = useRef(null); return ( @@ -137,34 +149,33 @@ function AddCredential() { { - if (ev.key === 'Enter') { + if (ev.key === "Enter") { handleSaveAdd(); ev.preventDefault(); } }} /> {invalidNickname ? ( - {invalidNickname} + {invalidNickname} ) : null}
- - - ); -} +}; export { AddCredential }; diff --git a/clients/web/react/src/_components/Credential/Credential.jsx b/clients/web/react/src/_components/Credential/Credential.jsx index 0b30c1b..16be667 100644 --- a/clients/web/react/src/_components/Credential/Credential.jsx +++ b/clients/web/react/src/_components/Credential/Credential.jsx @@ -1,36 +1,32 @@ -import React from 'react'; -import axios from 'axios'; -import aws_exports from '../../aws-exports'; +import React from "react"; +import { Image } from "react-bootstrap"; +import styles from "../component.module.css"; -import { EditCredential } from './EditCredential' -import { Image } from 'react-bootstrap'; - -axios.defaults.baseURL = aws_exports.apiEndpoint; - -function Credential(credential) { +import { EditCredential } from "./EditCredential"; +const Credential = function ({ credential }) { return ( <> -
-
+
+
-
+
{credential.credentialNickname.value}
YubiKey 5NFC
-

{credential.lastUsedTime}

+

{credential.lastUsedTime.seconds}

-
- +
+
-
+
); -} +}; export { Credential }; diff --git a/clients/web/react/src/_components/Credential/CredentialList.jsx b/clients/web/react/src/_components/Credential/CredentialList.jsx index ecca300..590fba3 100644 --- a/clients/web/react/src/_components/Credential/CredentialList.jsx +++ b/clients/web/react/src/_components/Credential/CredentialList.jsx @@ -1,25 +1,23 @@ -import React from 'react'; -import axios from 'axios'; -import aws_exports from '../../aws-exports'; +import React from "react"; +import { Card } from "react-bootstrap"; -import { AddCredential } from './AddCredential' -import { Credential } from './Credential' -import { Card } from 'react-bootstrap'; +import { AddCredential } from "./AddCredential"; +import { Credential } from "./Credential"; -axios.defaults.baseURL = aws_exports.apiEndpoint; - -function CredentialList({credentials}) { +const CredentialList = function ({ credentialItems }) { return ( -
Security Keys
- - {credentials.map((credential, index) => - - )} - - + +
Security Keys
+
+ + {credentialItems.map((credential, index) => ( + // eslint-disable-next-line react/no-array-index-key + + ))} + +
); -} - -export { CredentialList }; +}; +export default CredentialList; diff --git a/clients/web/react/src/_components/Credential/EditCredential.jsx b/clients/web/react/src/_components/Credential/EditCredential.jsx index 742edc3..c6f9b6d 100644 --- a/clients/web/react/src/_components/Credential/EditCredential.jsx +++ b/clients/web/react/src/_components/Credential/EditCredential.jsx @@ -1,23 +1,20 @@ -import React, { useState, useRef } from 'react'; +import React, { useState, useRef } from "react"; -import { credentialActions } from '../../_actions'; +import { Button, Modal, Alert } from "react-bootstrap"; +import { useDispatch } from "react-redux"; +import validate from "validate.js"; +import { credentialActions } from "../../_actions"; -import { Button, Modal, Alert } from 'react-bootstrap'; -import axios from 'axios'; -import validate from 'validate.js'; - -axios.defaults.baseURL = aws_exports.apiEndpoint; - -function EditCredential(credential) { +const EditCredential = function ({ credential }) { const [show, setShow] = useState(false); - const [nickname, setNickname] = useState(''); + const [nickname, setNickname] = useState(""); const [invalidNickname, setInvalidNickname] = useState(undefined); const [submitted, setSubmitted] = useState(false); - const handleClose = () => setShowAdd(false); + const dispatch = useDispatch(); + + const handleClose = () => setShow(false); const handleShow = () => { setNickname(credential.credentialNickname.value); - setCredential(credential); - setAttestationMetadata(credential.attestationMetadata.value); setShow(true); }; const handleDelete = () => { @@ -26,7 +23,7 @@ function EditCredential(credential) { credentialActions.delete(credential.credential.credentialId.base64) ); }; - var constraints = { + const constraints = { nickname: { length: { maximum: 20, @@ -36,13 +33,12 @@ function EditCredential(credential) { const handleSave = () => { setSubmitted(true); - let result = validate({ nickname: nickname }, constraints); + const result = validate({ nickname }, constraints); if (result) { - setInvalidNickname(result.nickname.join('. ')); + setInvalidNickname(result.nickname.join(". ")); return result; - } else { - setInvalidNickname(undefined); } + setInvalidNickname(undefined); setShow(false); credential.credentialNickname.value = nickname; @@ -57,7 +53,7 @@ function EditCredential(credential) { return ( <> - @@ -66,20 +62,19 @@ function EditCredential(credential) {
{invalidNickname ? ( - {invalidNickname} + {invalidNickname} ) : null} -    -




- - -
); -} +}; export { EditCredential }; diff --git a/clients/web/react/src/_components/Credential/index.js b/clients/web/react/src/_components/Credential/index.js index 30fb19d..e0d929e 100644 --- a/clients/web/react/src/_components/Credential/index.js +++ b/clients/web/react/src/_components/Credential/index.js @@ -1 +1 @@ -export * from './CredentialList' \ No newline at end of file +export * from "./CredentialList"; diff --git a/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx b/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx index 8891844..c3c950e 100644 --- a/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx +++ b/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx @@ -1,64 +1,74 @@ -import React from 'react'; -import axios from 'axios'; -import aws_exports from '../../aws-exports'; -import { userActions, alertActions } from '../_actions'; +import React, { useState } from "react"; +import { Button, Card, Modal } from "react-bootstrap"; +import { useDispatch } from "react-redux"; +import { Auth } from "aws-amplify"; +import { userActions, alertActions } from "../../_actions"; -import { Button, Card, Modal } from 'react-bootstrap'; - -axios.defaults.baseURL = aws_exports.apiEndpoint; - -function DeleteUser({ userToken, navigation }) { +const DeleteUser = function ({ userToken }) { const [show, setShow] = useState(false); - const handleShow = () => { - setShow(true); - } - const handleClose = () => { - setShow(false); - } + const dispatch = useDispatch(); + const handleShow = () => { + setShow(true); + }; + const handleClose = () => { + setShow(false); + }; + + const handleDelete = () => { + setShow(false); + Auth.currentAuthenticatedUser() + .then( + (user) => + new Promise((resolve, reject) => { + user.deleteUser((error) => { + if (error) { + return reject(error); + } + dispatch(userActions.delete(userToken)); - const handleDelete = () => { - setShow(false); - Auth.currentAuthenticatedUser().then((user) => new Promise((resolve, reject) => { - user.deleteUser(error => { - if(error) { - return reject(error); - } - dispatch(userActions.delete(userToken)); - navigation.go('LogOutStep'); - - resolve(); - }); - })) - .catch(error => { + resolve(); + }); + }) + ) + .catch((error) => { console.error(error); dispatch(alertActions.error(error.message)); }); - } + }; - return ( - <> - -
Delete Account
- - - -
- - + return ( + <> + + +
Delete Account
+
+ + + +
+ + Delete Account - - - - - - - - - - - ); -} +
+ + + + + + + +
+ + ); +}; export { DeleteUser }; diff --git a/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx b/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx index 0a74d58..bfa7107 100644 --- a/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx +++ b/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx @@ -1,25 +1,22 @@ -import React from 'react'; -import axios from 'axios'; -import aws_exports from '../../aws-exports'; +import React, { useState, useEffect } from "react"; -import { useSelector } from 'react-redux'; -import { Alert, Button, Card, Modal } from 'react-bootstrap'; +import { useDispatch, useSelector } from "react-redux"; +import { Alert, Button, Card, Modal } from "react-bootstrap"; +import { credentialActions } from "../../_actions"; -axios.defaults.baseURL = aws_exports.apiEndpoint; - -function RecoveryCodes({ credentials }) { - let recoveryCodesViewed = credentials.recoveryCodesViewed; - let allRecoveryCodesUsed = credentials.allRecoveryCodesUsed; +const RecoveryCodes = function ({ credentials }) { + const { recoveryCodesViewed } = credentials.recoveryCodesViewed; + const { allRecoveryCodesUsed } = credentials.allRecoveryCodesUsed; const recoveryCodes = useSelector((state) => state.recoveryCodes); - const [showCodes, setShowCodes] = useState(false); + const dispatch = useDispatch(); const handleClose = () => { setShowCodes(false); }; const handleShow = () => { setShowCodes(true); - dispatch(credentialActions.recoveryCodesViewed()); + dispatch(credentialActions.listRecoveryCodes()); }; const handleGenerate = () => { setShowCodes(true); @@ -39,7 +36,7 @@ function RecoveryCodes({ credentials }) {
Recovery Options
- @@ -53,20 +50,20 @@ function RecoveryCodes({ credentials }) { Protect your recovery codes as you would a password. We recommend saving them in a safe spot, such as password manager. - + If you lose you all your authenticators and don't have the recovery codes you will lose access to your account. {recoveryCodes.loading && Loading recovery codes...} {recoveryCodes.generating && Generating recovery codes...} {recoveryCodes.error && ( - ERROR: {recoveryCodes.error} + ERROR: {recoveryCodes.error} )} {recoveryCodes.codesRemaining && recoveryCodes.codesRemaining === 0 ? ( Please generate new recovery codes now. ) : ( - '' + "" )} {recoveryCodes.codes && (
    @@ -78,40 +75,40 @@ function RecoveryCodes({ credentials }) {
)} {recoveryCodes.codes && ( - + Save your recovery codes now. They will not be shown again. )} {recoveryCodes.codesRemaining && recoveryCodes.codesRemaining > 0 ? ( {recoveryCodes.codesRemaining} recovery codes remaining. ) : ( - '' + "" )} {allRecoveryCodesUsed && (!recoveryCodes.generating || !recoveryCodes.codes) && ( - + All recovery codes have been used. Please generate new recovery codes now. )} -

+

Generate new recovery codes
- - ); -} +}; export { RecoveryCodes }; From 656f6ea52137c5a4f685af49e29c7ad57de41f2d Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 29 Nov 2021 11:33:28 -0600 Subject: [PATCH 23/66] Added logout step --- clients/web/react/src/App/App.jsx | 134 ++++++++++-------- clients/web/react/src/HomePage/HomePage.jsx | 11 +- .../web/react/src/LogoutPage/LogoutPage.jsx | 31 ++++ clients/web/react/src/LogoutPage/index.js | 3 + 4 files changed, 111 insertions(+), 68 deletions(-) create mode 100644 clients/web/react/src/LogoutPage/LogoutPage.jsx create mode 100644 clients/web/react/src/LogoutPage/index.js diff --git a/clients/web/react/src/App/App.jsx b/clients/web/react/src/App/App.jsx index 9f168e6..486d281 100644 --- a/clients/web/react/src/App/App.jsx +++ b/clients/web/react/src/App/App.jsx @@ -1,63 +1,77 @@ -import React, { useEffect } from 'react'; -import { Router, Route, Switch, Redirect } from 'react-router-dom'; -import { useDispatch, useSelector } from 'react-redux'; -import { Jumbotron, Container, Row, Col, Card } from 'react-bootstrap'; - -import { history } from '../_helpers'; -import { alertActions } from '../_actions'; -import { PrivateRoute } from '../_components'; -import { HomePage } from '../HomePage'; -import { IdentifierFirstLoginFlowPage } from '../LoginPage'; -import { LoginWithSecurityKeyPage } from '../LoginWithSecurityKeyPage'; -import { RegisterPage } from '../RegisterPage'; -import { IdentifierFirstSignUpFlowPage } from '../RegisterPage'; -import { IdentifierFirstFlowProto } from '../IdentifierFirstFlowProto'; - -import Amplify from 'aws-amplify'; -import aws_exports from '../aws-exports'; +import React, { useEffect } from "react"; +import { Router, Route, Switch, Redirect } from "react-router-dom"; +import { useDispatch, useSelector } from "react-redux"; +import { Jumbotron, Container, Row, Col, Card } from "react-bootstrap"; + +import Amplify from "aws-amplify"; +import { history } from "../_helpers"; +import { alertActions } from "../_actions"; +import { PrivateRoute } from "../_components"; +import HomePage from "../HomePage"; +import { IdentifierFirstLoginFlowPage } from "../LoginPage"; +import { LoginWithSecurityKeyPage } from "../LoginWithSecurityKeyPage"; +import { RegisterPage, IdentifierFirstSignUpFlowPage } from "../RegisterPage"; +import { IdentifierFirstFlowProto } from "../IdentifierFirstFlowProto"; +import LogoutPage from "../LogoutPage"; + +import aws_exports from "../aws-exports"; const config = Amplify.configure(aws_exports); -function App() { - const alert = useSelector(state => state.alert); - const dispatch = useDispatch(); - - //console.log(JSON.stringify(config)); - - useEffect(() => { - history.listen((location, action) => { - // clear alert on location change - dispatch(alertActions.clear()); - }); - }, []); - - return ( - - - - - {alert.message && -
{alert.message}
- } - - - YubicoLabs - - - - - - - - - - - - -
-
-
- ); -} - -export { App }; \ No newline at end of file +const App = function () { + const alert = useSelector((state) => state.alert); + const dispatch = useDispatch(); + + // console.log(JSON.stringify(config)); + + useEffect(() => { + history.listen((location, action) => { + // clear alert on location change + dispatch(alertActions.clear()); + }); + }, []); + + return ( + + + + + {alert.message && ( +
{alert.message}
+ )} + + + YubicoLabs + + + + + + + + + + + + + +
+
+
+ ); +}; + +export { App }; diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 8b32eda..149a8bc 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -30,13 +30,8 @@ const HomePage = function () { currentAuthenticatedUser(); }, []); - const logOut = async () => { - try { - await Auth.signOut(); - } catch (error) { - console.log("error signing out: ", error); - } - history.push("/login"); + const logout = async () => { + history.push("/logout"); }; return ( @@ -157,7 +152,7 @@ const HomePage = function () {
-
diff --git a/clients/web/react/src/LogoutPage/LogoutPage.jsx b/clients/web/react/src/LogoutPage/LogoutPage.jsx new file mode 100644 index 0000000..ab34abc --- /dev/null +++ b/clients/web/react/src/LogoutPage/LogoutPage.jsx @@ -0,0 +1,31 @@ +import React, { useEffect } from "react"; +import { Spinner } from "react-bootstrap"; +import { Auth } from "aws-amplify"; +import { history } from "../_helpers"; + +const LogoutPage = function () { + const logoutUser = async () => { + console.log("Called into loader"); + try { + await Auth.signOut(); + localStorage.removeItem("username"); + localStorage.removeItem("user"); + history.push("/"); + } catch (err) { + console.error("There was an error signing out the user: ", err); + } + }; + + useEffect(() => { + setTimeout(logoutUser, 1000); + }, []); + + return ( +
+ +

Thank you for joining us!

+
+ ); +}; + +export default LogoutPage; diff --git a/clients/web/react/src/LogoutPage/index.js b/clients/web/react/src/LogoutPage/index.js new file mode 100644 index 0000000..fb0c1b4 --- /dev/null +++ b/clients/web/react/src/LogoutPage/index.js @@ -0,0 +1,3 @@ +import LogoutPage from "./LogoutPage"; + +export default LogoutPage; From 1213315088410f9a02c52326fa670207c88934e0 Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 29 Nov 2021 13:33:41 -0600 Subject: [PATCH 24/66] Added error handling for empty keys and recovery code props --- clients/web/react/src/HomePage/HomePage.jsx | 56 ++++++++++++++++--- .../_components/Credential/CredentialList.jsx | 2 + .../src/_components/DeleteUser/DeleteUser.jsx | 3 +- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 149a8bc..f93a6da 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -1,8 +1,6 @@ -import React, { useEffect } from "react"; -import { Link } from "react-router-dom"; +import React, { useState, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import { Button, Card, InputGroup, FormControl, Table } from "react-bootstrap"; -import { Auth } from "aws-amplify"; import { userActions, credentialActions } from "../_actions"; import { history } from "../_helpers"; import CredentialList from "../_components/Credential/CredentialList"; @@ -12,6 +10,12 @@ import { DeleteUser } from "../_components/DeleteUser/DeleteUser"; const HomePage = function () { const authentication = useSelector((state) => state.authentication); const credentials = useSelector((state) => state.credentials); + const [credentialItems, setCredentialItems] = useState([]); + const [recoveryCodeProps, setRecoveryCodeProps] = useState({ + allRecoveryCodesUsed: false, + recoveryCodesViewed: false, + }); + const [credentialsLoading, setCredentialsLoading] = useState(true); const alert = useSelector((state) => state.alert); const dispatch = useDispatch(); @@ -21,8 +25,38 @@ const HomePage = function () { } useEffect(() => { - if (authentication.user.token) { - dispatch(credentialActions.getAll(authentication.user.token)); + if (credentials === {} || credentials.loading) { + setCredentialsLoading(true); + } else { + if (credentials.items) { + setCredentialItems(credentials.items); + } + if ( + credentials.allRecoveryCodesUsed !== undefined && + credentials.recoveryCodesViewed !== undefined + ) { + setRecoveryCodeProps({ + allRecoveryCodesUsed: credentials.allRecoveryCodesUsed, + recoveryCodesViewed: credentials.recoveryCodesViewed, + }); + } + setCredentialsLoading(false); + } + }, [credentials]); + + useEffect(() => { + try { + if (authentication.user.token !== undefined) { + console.log( + "Calling get all with credential: ", + authentication.user.token + ); + dispatch(credentialActions.getAll(authentication.user.token)); + } + } catch (error) { + console.warn( + "No user detected, please wait for the user to fully authenticate" + ); } }, [authentication, alert]); @@ -94,8 +128,10 @@ const HomePage = function () { - {credentials.items && ( - + {credentialsLoading ? ( +

Loading

+ ) : ( + )} @@ -142,8 +178,10 @@ const HomePage = function () { - {!credentials.loading && credentials.items && ( - + {credentialsLoading ? ( +

Loading

+ ) : ( + )} {authentication.user.token && ( diff --git a/clients/web/react/src/_components/Credential/CredentialList.jsx b/clients/web/react/src/_components/Credential/CredentialList.jsx index 590fba3..5edb2e5 100644 --- a/clients/web/react/src/_components/Credential/CredentialList.jsx +++ b/clients/web/react/src/_components/Credential/CredentialList.jsx @@ -5,6 +5,8 @@ import { AddCredential } from "./AddCredential"; import { Credential } from "./Credential"; const CredentialList = function ({ credentialItems }) { + console.log("Printing the credentials, ", credentialItems); + return ( diff --git a/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx b/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx index c3c950e..97db95f 100644 --- a/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx +++ b/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx @@ -3,6 +3,7 @@ import { Button, Card, Modal } from "react-bootstrap"; import { useDispatch } from "react-redux"; import { Auth } from "aws-amplify"; import { userActions, alertActions } from "../../_actions"; +import { history } from "../../_helpers"; const DeleteUser = function ({ userToken }) { const [show, setShow] = useState(false); @@ -25,8 +26,8 @@ const DeleteUser = function ({ userToken }) { return reject(error); } dispatch(userActions.delete(userToken)); - resolve(); + history.push("/logout"); }); }) ) From 0c5beb8f155b37e25d1499c53f386eba4391ec3e Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 29 Nov 2021 13:55:04 -0600 Subject: [PATCH 25/66] Fixed card spacing issue --- clients/web/react/src/HomePage/HomePage.jsx | 5 +++-- .../web/react/src/_components/Credential/CredentialList.jsx | 5 +++-- clients/web/react/src/_components/DeleteUser/DeleteUser.jsx | 3 ++- .../react/src/_components/RecoveryCodes/RecoveryCodes.jsx | 3 ++- clients/web/react/src/_components/component.module.css | 4 ++++ 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index f93a6da..3023ff1 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -6,6 +6,7 @@ import { history } from "../_helpers"; import CredentialList from "../_components/Credential/CredentialList"; import { RecoveryCodes } from "../_components/RecoveryCodes/RecoveryCodes"; import { DeleteUser } from "../_components/DeleteUser/DeleteUser"; +import styles from "../_components/component.module.css"; const HomePage = function () { const authentication = useSelector((state) => state.authentication); @@ -72,7 +73,7 @@ const HomePage = function () { <>

Account Security

- +
Trusted Devices
@@ -133,7 +134,7 @@ const HomePage = function () { ) : ( )} - +
Server Verified PIN
diff --git a/clients/web/react/src/_components/Credential/CredentialList.jsx b/clients/web/react/src/_components/Credential/CredentialList.jsx index 5edb2e5..5f5b067 100644 --- a/clients/web/react/src/_components/Credential/CredentialList.jsx +++ b/clients/web/react/src/_components/Credential/CredentialList.jsx @@ -3,12 +3,13 @@ import { Card } from "react-bootstrap"; import { AddCredential } from "./AddCredential"; import { Credential } from "./Credential"; +import styles from "../component.module.css"; const CredentialList = function ({ credentialItems }) { console.log("Printing the credentials, ", credentialItems); return ( - +
Security Keys
@@ -17,8 +18,8 @@ const CredentialList = function ({ credentialItems }) { // eslint-disable-next-line react/no-array-index-key ))} + -
); }; diff --git a/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx b/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx index 97db95f..dbf50ed 100644 --- a/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx +++ b/clients/web/react/src/_components/DeleteUser/DeleteUser.jsx @@ -4,6 +4,7 @@ import { useDispatch } from "react-redux"; import { Auth } from "aws-amplify"; import { userActions, alertActions } from "../../_actions"; import { history } from "../../_helpers"; +import styles from "../component.module.css"; const DeleteUser = function ({ userToken }) { const [show, setShow] = useState(false); @@ -39,7 +40,7 @@ const DeleteUser = function ({ userToken }) { return ( <> - +
Delete Account
diff --git a/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx b/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx index bfa7107..a8fdd08 100644 --- a/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx +++ b/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.jsx @@ -3,6 +3,7 @@ import React, { useState, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import { Alert, Button, Card, Modal } from "react-bootstrap"; import { credentialActions } from "../../_actions"; +import styles from "../component.module.css"; const RecoveryCodes = function ({ credentials }) { const { recoveryCodesViewed } = credentials.recoveryCodesViewed; @@ -31,7 +32,7 @@ const RecoveryCodes = function ({ credentials }) { return ( <> - +
Recovery Options
diff --git a/clients/web/react/src/_components/component.module.css b/clients/web/react/src/_components/component.module.css index b89a1d8..0e49343 100644 --- a/clients/web/react/src/_components/component.module.css +++ b/clients/web/react/src/_components/component.module.css @@ -40,4 +40,8 @@ .section-divider { border-top: 2px #e7e7e7 solid; +} + +.cardSpacing { + margin-bottom: 1em; } \ No newline at end of file From 2d7e860455c477594c1dcb2cac45ea43d4e16577 Mon Sep 17 00:00:00 2001 From: csalas Date: Fri, 3 Dec 2021 14:08:57 -0600 Subject: [PATCH 26/66] Have working SVPIN flow for login/signin, pushing while troubleshooting refresh bugs --- clients/web/react/src/HomePage/HomePage.jsx | 25 +- clients/web/react/src/LoginPage/LogInStep.js | 763 ++++++++++-------- .../web/react/src/LogoutPage/LogoutPage.jsx | 2 + .../web/react/src/RegisterPage/SignUpStep.js | 42 +- .../src/_components/Credential/Credential.jsx | 6 +- .../ServerVerifiedPin/ServerVerifiedPin.jsx | 253 ++++++ .../react/src/_components/WebAuthnClient.js | 622 ++++++++------ 7 files changed, 1102 insertions(+), 611 deletions(-) create mode 100644 clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.jsx diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 3023ff1..7c02907 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -10,6 +10,7 @@ import styles from "../_components/component.module.css"; const HomePage = function () { const authentication = useSelector((state) => state.authentication); + const [jwt, setjwt] = useState(""); const credentials = useSelector((state) => state.credentials); const [credentialItems, setCredentialItems] = useState([]); const [recoveryCodeProps, setRecoveryCodeProps] = useState({ @@ -46,7 +47,17 @@ const HomePage = function () { }, [credentials]); useEffect(() => { - try { + dispatch(credentialActions.getAll(authentication.user.token)); + }, [jwt]); + + useEffect(() => { + if (!jwt && authentication.user.token) { + setjwt(authentication.user.token); + } + }, [authentication, alert]); + + useEffect(() => { + setTimeout(() => { if (authentication.user.token !== undefined) { console.log( "Calling get all with credential: ", @@ -54,15 +65,13 @@ const HomePage = function () { ); dispatch(credentialActions.getAll(authentication.user.token)); } - } catch (error) { - console.warn( - "No user detected, please wait for the user to fully authenticate" - ); - } - }, [authentication, alert]); + }, 2000); + }, []); useEffect(() => { - currentAuthenticatedUser(); + // window.location.reload(); + setTimeout(() => currentAuthenticatedUser(), 300); + // currentAuthenticatedUser(); }, []); const logout = async () => { diff --git a/clients/web/react/src/LoginPage/LogInStep.js b/clients/web/react/src/LoginPage/LogInStep.js index e61ffaf..cd1287a 100644 --- a/clients/web/react/src/LoginPage/LogInStep.js +++ b/clients/web/react/src/LoginPage/LogInStep.js @@ -1,52 +1,55 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, Form, Spinner } from 'react-bootstrap'; -import { useDispatch, useSelector } from 'react-redux'; - -import { userActions, credentialActions, alertActions } from '../_actions'; -import { history } from '../_helpers'; -import { ServerVerifiedPin } from '../_components'; - -import { get, supported } from '@github/webauthn-json'; -import base64url from 'base64url'; -import { Auth } from 'aws-amplify'; -import validate from 'validate.js'; +import React, { useState, useEffect, useContext } from "react"; +import { Button, InputGroup, Form, Spinner } from "react-bootstrap"; +import { useDispatch, useSelector } from "react-redux"; + +import { get, supported } from "@github/webauthn-json"; +import base64url from "base64url"; +import { Auth } from "aws-amplify"; +import validate from "validate.js"; +import { WebAuthnClient } from "../_components"; +import ServerVerifiedPin from "../_components/ServerVerifiedPin/ServerVerifiedPin"; +import { history } from "../_helpers"; +import { userActions, credentialActions, alertActions } from "../_actions"; import styles from "../_components/component.module.css"; -const LogInStep = ({ navigation }) => { - const [inputs, setInputs] = useState({ - username: localStorage.getItem('username'), - forgotStep: false, - continue: false - }); - const [errors, setErrors] = useState({ - username: '' - }); - const [validated, setValidated] = useState(false); - const [cognitoUser, setCognitoUser] = useState({}); - const webAuthnStartResponse = useSelector(state => state.authentication.webAuthnStartResponse); - const defaultInvalidPIN = -1; - const [continueSubmitted, setContinueSubmitted] = useState(false); - - const constraints = { - username: { - presence: true, - format: { - pattern: "[a-z0-9_\-]+", - flags: "i", - message: "can only contain a-z, 0-9, or _-" - }, - length: { - minimum: 3, - maximum: 20 - } - } - }; - - const dispatch = useDispatch(); - - // reset login status - /*useEffect(() => { +const LogInStep = function ({ navigation }) { + const [inputs, setInputs] = useState({ + username: localStorage.getItem("username"), + forgotStep: false, + continue: false, + }); + const [errors, setErrors] = useState({ + username: "", + }); + const [validated, setValidated] = useState(false); + const [cognitoUser, setCognitoUser] = useState({}); + const webAuthnStartResponse = useSelector( + (state) => state.authentication.webAuthnStartResponse + ); + const defaultInvalidPIN = -1; + const [continueSubmitted, setContinueSubmitted] = useState(false); + const [serverVerifiedPin, setServerVerifiedPin] = useState(); + + const constraints = { + username: { + presence: true, + format: { + pattern: "[a-z0-9_-]+", + flags: "i", + message: "can only contain a-z, 0-9, or _-", + }, + length: { + minimum: 3, + maximum: 20, + }, + }, + }; + + const dispatch = useDispatch(); + + // reset login status + /* useEffect(() => { dispatch(userActions.logout()); if(inputs.username) { @@ -56,313 +59,413 @@ const LogInStep = ({ navigation }) => { dispatch(userActions.webAuthnStart()); } - }, []);*/ + }, []); */ - useEffect(() => { - if (webAuthnStartResponse) { - signInWithoutUsername(); - } - }, [webAuthnStartResponse]); - - function getUV(authenticatorData) { - let buffer = base64url.toBuffer(authenticatorData); - - let flagsBuf = buffer.slice(32, 33); - let flagsInt = flagsBuf[0]; - let flags = { - up: !!(flagsInt & 0x01), - uv: !!(flagsInt & 0x04), - at: !!(flagsInt & 0x40), - ed: !!(flagsInt & 0x80), - flagsInt - }; - return flags.uv; + useEffect(() => { + if (webAuthnStartResponse) { + signInWithoutUsername(); } - - async function signIn(name) { - console.log("signIn ", name); - setContinueSubmitted(true); - - const lowercaseName = name.toLocaleLowerCase(); - - localStorage.setItem('username', lowercaseName); - - try { - let cognitoUser = await Auth.signIn(lowercaseName); - setCognitoUser(cognitoUser); - console.log("SignIn CognitoUser: ", cognitoUser); - - if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.create') { - dispatch(alertActions.error("Please Sign Up")); - history.push('/register'); - return; - } else if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.get') { - - console.log("assertion request: " + JSON.stringify(cognitoUser.challengeParam, null, 2)); - - const request = JSON.parse(cognitoUser.challengeParam.publicKeyCredentialRequestOptions); - console.log("request: ", request); - - const publicKey = { "publicKey": request.publicKeyCredentialRequestOptions }; - console.log("publicKey: ", publicKey); - - let assertionResponse = await get(publicKey); - console.log("assertion response: " + JSON.stringify(assertionResponse)); - - let uv = getUV(assertionResponse.response.authenticatorData); - console.log("uv: " + uv); - - let challengeResponse = { - credential: assertionResponse, - requestId: request.requestId, - pinCode: defaultInvalidPIN - }; - console.log("challengeResponse: ", challengeResponse); - - if (uv == false) { - dispatch(credentialActions.getUV(challengeResponse)); - } else { - console.log("sending Custom Challenge Answer"); - // to send the answer of the custom challenge - Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) - .then(user => { - console.log(user); - - Auth.currentSession() - .then(data => { - dispatch(alertActions.success('Authentication successful')); - let userData = { - id: 1, - username: user.attributes.name, - token: data.getAccessToken().getJwtToken() - } - localStorage.setItem('user', JSON.stringify(userData)); - console.log("userData ", localStorage.getItem('user')); - - registerTrustedDeviceOrContinue('/'); - }) - .catch(err => { - console.error("currentSession error: ", err); - dispatch(alertActions.error("Something went wrong. ", err.message)); - setContinueSubmitted(false); - }); - - }) - .catch(err => { - console.error("sendCustomChallengeAnswer error: ", err); - dispatch(alertActions.error(err.message)); - }); - } - } else { - setContinueSubmitted(false); - dispatch(alertActions.error("Invalid server response")); - } - } catch (err) { - console.error("signIn error"); - console.error(err); - setContinueSubmitted(false); - dispatch(alertActions.error(err.message)); - } + }, [webAuthnStartResponse]); + + function getUV(authenticatorData) { + const buffer = base64url.toBuffer(authenticatorData); + + const flagsBuf = buffer.slice(32, 33); + const flagsInt = flagsBuf[0]; + const flags = { + up: !!(flagsInt & 0x01), + uv: !!(flagsInt & 0x04), + at: !!(flagsInt & 0x40), + ed: !!(flagsInt & 0x80), + flagsInt, + }; + return flags.uv; + } + + const UVPromise = () => { + return new Promise((resolve, reject) => { + const svpinCreateProps = { + type: "dispatch", + saveCallback: resolve, + closeCallback: reject, + }; + console.log("SignUpStep UVPromise(): ", svpinCreateProps); + setServerVerifiedPin(); + }); + }; + + async function uv(challengeResponse) { + dispatch(credentialActions.getUV(challengeResponse)); + const pinResult = await UVPromise(); + console.log("SignUpStep PIN Result: ", pinResult.value); + return pinResult.value; + } + + async function signIn(username) { + console.log("LoginStep Signing In User, ", username); + + try { + const userData = await WebAuthnClient.signIn(username, uv); + console.log("LogInStep signin userData: ", userData); + + if (userData === undefined) { + console.log("LogInStep error: userData undefined"); + dispatch(alertActions.error("Something went wrong. Please try again.")); + } else { + dispatch(alertActions.success("Login Successful")); + localStorage.setItem("credential", JSON.stringify(userData.credential)); + console.log("LogInStep Successful credential ", userData.credential); + } + } catch (error) { + console.log("LoginStep signin error"); + console.log(error); + dispatch(alertActions.error(error.message)); } + } + + /* + async function signIn(name) { + console.log("signIn ", name); + setContinueSubmitted(true); + + const lowercaseName = name.toLocaleLowerCase(); + + localStorage.setItem("username", lowercaseName); + + try { + const cognitoUser = await Auth.signIn(lowercaseName); + setCognitoUser(cognitoUser); + console.log("SignIn CognitoUser: ", cognitoUser); + + if ( + cognitoUser.challengeName === "CUSTOM_CHALLENGE" && + cognitoUser.challengeParam.type === "webauthn.create" + ) { + dispatch(alertActions.error("Please Sign Up")); + history.push("/register"); + return; + } + if ( + cognitoUser.challengeName === "CUSTOM_CHALLENGE" && + cognitoUser.challengeParam.type === "webauthn.get" + ) { + console.log( + `assertion request: ${JSON.stringify( + cognitoUser.challengeParam, + null, + 2 + )}` + ); - function registerTrustedDeviceOrContinue(path) { - let trustedDevice = localStorage.getItem('trustedDevice'); - console.log("trustedDevice=",trustedDevice); - - if (trustedDevice === null) { - PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() - .then(function (available) { - if (available) { - registerTrustedDeviceStep(); - } else { - history.push(path); - } - }).catch(function (err) { - console.error(err); - history.push(path); - }); + const request = JSON.parse( + cognitoUser.challengeParam.publicKeyCredentialRequestOptions + ); + console.log("request: ", request); - } else { - history.push(path); - } - } + const publicKey = { + publicKey: request.publicKeyCredentialRequestOptions, + }; + console.log("publicKey: ", publicKey); - function UV(props) { - const cognitoUser = props.cognitoUser; - const finishUVRequest = useSelector(state => state.credentials.finishUVRequest); - const svpinDispatchProps = { type: "dispatch", saveCallback: finishUVResponse, showSelector: finishUVRequest }; - - - function finishUVResponse(fields) { - let challengeResponse = finishUVRequest; - console.log("sending authenticator response with sv-pin: ", challengeResponse); - challengeResponse.pinCode = parseInt(fields.pin); - - Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) - .then(user => { - console.log("uv sendCustomChallengeAnswer: ", user); - - Auth.currentSession() - .then(data => { - dispatch(alertActions.success('Authentication successful')); - let userData = { - id: 1, - username: user.attributes.name, - token: data.getAccessToken().getJwtToken() - } - localStorage.setItem('user', JSON.stringify(userData)); - console.log("userData ", localStorage.getItem('user')); - history.push('/'); - }) - .catch(err => { - console.log("currentSession error: ", err); - dispatch(alertActions.error("Something went wrong. ", err.message)); - setContinueSubmitted(false); - }); + const assertionResponse = await get(publicKey); + console.log(`assertion response: ${JSON.stringify(assertionResponse)}`); + + const uv = getUV(assertionResponse.response.authenticatorData); + console.log(`uv: ${uv}`); + + const challengeResponse = { + credential: assertionResponse, + requestId: request.requestId, + pinCode: defaultInvalidPIN, + }; + console.log("challengeResponse: ", challengeResponse); + if (uv == false) { + dispatch(credentialActions.getUV(challengeResponse)); + } else { + console.log("sending Custom Challenge Answer"); + // to send the answer of the custom challenge + Auth.sendCustomChallengeAnswer( + cognitoUser, + JSON.stringify(challengeResponse) + ) + .then((user) => { + console.log(user); + + Auth.currentSession() + .then((data) => { + dispatch(alertActions.success("Authentication successful")); + const userData = { + id: 1, + username: user.attributes.name, + token: data.getAccessToken().getJwtToken(), + }; + localStorage.setItem("user", JSON.stringify(userData)); + console.log("userData ", localStorage.getItem("user")); + + registerTrustedDeviceOrContinue("/"); }) - .catch(err => { - console.log("sendCustomChallengeAnswer error: ", err); - let message = "Invalid PIN"; - dispatch(alertActions.error(message)); - setContinueSubmitted(false); + .catch((err) => { + console.error("currentSession error: ", err); + dispatch( + alertActions.error("Something went wrong. ", err.message) + ); + setContinueSubmitted(false); }); - dispatch(credentialActions.completeUV()); + }) + .catch((err) => { + console.error("sendCustomChallengeAnswer error: ", err); + dispatch(alertActions.error(err.message)); + }); } - - return ( - <> - - - ); - } - - const promptSvPinStep = () => { - navigation.go('PromptSvPinStep'); - } - const registerTrustedDeviceStep = () => { - navigation.go('RegisterTrustedDeviceStep'); + } else { + setContinueSubmitted(false); + dispatch(alertActions.error("Invalid server response")); + } + } catch (err) { + console.error("signIn error"); + console.error(err); + setContinueSubmitted(false); + dispatch(alertActions.error(err.message)); } - const signUpStep = () => { - history.push('/register'); - } - const forgotStep = () => { - navigation.go('ForgotStep'); - } - const accountSecurityStep = () => { - signIn(); + } + */ + + function registerTrustedDeviceOrContinue(path) { + const trustedDevice = localStorage.getItem("trustedDevice"); + console.log("trustedDevice=", trustedDevice); + + if (trustedDevice === null) { + PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() + .then(function (available) { + if (available) { + registerTrustedDeviceStep(); + } else { + history.push(path); + } + }) + .catch(function (err) { + console.error(err); + history.push(path); + }); + } else { + history.push(path); } + } + /* + const UV = function (props) { + const { cognitoUser } = props; + const finishUVRequest = useSelector( + (state) => state.credentials.finishUVRequest + ); + const svpinDispatchProps = { + type: "dispatch", + saveCallback: finishUVResponse, + showSelector: finishUVRequest, + }; - const forgotClickHandler = () => { - setInputs(inputs => ({ ...inputs, ["continue"]: false })); - setInputs(inputs => ({ ...inputs, ["forgotStep"]: true })); + function finishUVResponse(fields) { + const challengeResponse = finishUVRequest; + console.log( + "sending authenticator response with sv-pin: ", + challengeResponse + ); + challengeResponse.pinCode = parseInt(fields.pin); + + Auth.sendCustomChallengeAnswer( + cognitoUser, + JSON.stringify(challengeResponse) + ) + .then((user) => { + console.log("uv sendCustomChallengeAnswer: ", user); + + Auth.currentSession() + .then((data) => { + dispatch(alertActions.success("Authentication successful")); + const userData = { + id: 1, + username: user.attributes.name, + token: data.getAccessToken().getJwtToken(), + }; + localStorage.setItem("user", JSON.stringify(userData)); + console.log("userData ", localStorage.getItem("user")); + history.push("/"); + }) + .catch((err) => { + console.log("currentSession error: ", err); + dispatch( + alertActions.error("Something went wrong. ", err.message) + ); + setContinueSubmitted(false); + }); + }) + .catch((err) => { + console.log("sendCustomChallengeAnswer error: ", err); + const message = "Invalid PIN"; + dispatch(alertActions.error(message)); + setContinueSubmitted(false); + }); + dispatch(credentialActions.completeUV()); } - const continueClickHandler = () => { - setInputs(inputs => ({ ...inputs, ["continue"]: true })); - setInputs(inputs => ({ ...inputs, ["forgotStep"]: false })); + return ; + }; +*/ + const promptSvPinStep = () => { + navigation.go("PromptSvPinStep"); + }; + const registerTrustedDeviceStep = () => { + navigation.go("RegisterTrustedDeviceStep"); + }; + const signUpStep = () => { + history.push("/register"); + }; + const forgotStep = () => { + navigation.go("ForgotStep"); + }; + const accountSecurityStep = () => { + // signIn(); + }; + + const forgotClickHandler = () => { + setInputs((inputs) => ({ ...inputs, continue: false })); + setInputs((inputs) => ({ ...inputs, forgotStep: true })); + }; + + const continueClickHandler = () => { + setInputs((inputs) => ({ ...inputs, continue: true })); + setInputs((inputs) => ({ ...inputs, forgotStep: false })); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setInputs((inputs) => ({ ...inputs, [name]: value })); + + setValidated(false); + + const result = validate({ username: value }, constraints); + if (result) { + setErrors((errors) => ({ + ...errors, + [name]: result.username.join(". "), + })); + } else { + setErrors((errors) => ({ ...errors, [name]: undefined })); } + }; - const handleChange = (e) => { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); + const handleSubmit = async (event) => { + const form = event.currentTarget; - setValidated(false); + event.preventDefault(); - const result = validate({ username: value }, constraints); - if (result) { - setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } + if (form.checkValidity() === false) { + event.stopPropagation(); } - const handleSubmit = async (event) => { - const form = event.currentTarget; - - event.preventDefault(); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - if (isUsernameValid()) { - setValidated(true); - if (inputs.continue === true) { - signIn(inputs.username); - } else if (inputs.forgotStep === true) { - forgotStep(); - } - - } else { - setValidated(false); - } + if (isUsernameValid()) { + setValidated(true); + if (inputs.continue === true) { + await signIn(inputs.username); + history.push("/"); + } else if (inputs.forgotStep === true) { + forgotStep(); + } + } else { + setValidated(false); } + }; - const isUsernameValid = () => { - if (validate({ username: inputs.username }, constraints)) { - return false; - } - return true; + const isUsernameValid = () => { + if (validate({ username: inputs.username }, constraints)) { + return false; } - - - return ( - <> -
-

Welcome

- -
-
- - - - @ - - - - {errors.username} - - - - - -

-
-
- OR -
-
- -
-
-
-
-
-
Don't have an account? Sign Up
-
- - - ); + return true; + }; + + return ( + <> +
+

Welcome

+ +
+
+ + + + @ + + + + {errors.username} + + + + + + +
+
+
+ OR +
+
+ +
+
+
+
+
+
+ Don't have an account?{" "} + + Sign Up + +
+
+ {serverVerifiedPin} + + ); }; -export default LogInStep; \ No newline at end of file +export default LogInStep; diff --git a/clients/web/react/src/LogoutPage/LogoutPage.jsx b/clients/web/react/src/LogoutPage/LogoutPage.jsx index ab34abc..5862712 100644 --- a/clients/web/react/src/LogoutPage/LogoutPage.jsx +++ b/clients/web/react/src/LogoutPage/LogoutPage.jsx @@ -10,7 +10,9 @@ const LogoutPage = function () { await Auth.signOut(); localStorage.removeItem("username"); localStorage.removeItem("user"); + localStorage.removeItem("credential"); history.push("/"); + setTimeout(() => window.location.reload(), 100); } catch (err) { console.error("There was an error signing out the user: ", err); } diff --git a/clients/web/react/src/RegisterPage/SignUpStep.js b/clients/web/react/src/RegisterPage/SignUpStep.js index 33cd872..7df7183 100644 --- a/clients/web/react/src/RegisterPage/SignUpStep.js +++ b/clients/web/react/src/RegisterPage/SignUpStep.js @@ -1,17 +1,20 @@ +/* eslint-disable prettier/prettier */ import React, { useState, useEffect, useContext } from 'react'; import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; import { useDispatch, useSelector } from 'react-redux'; +import validate from 'validate.js'; import { history } from '../_helpers'; import { WebAuthnClient } from '../_components'; import { userActions, credentialActions, alertActions } from '../_actions'; +import ServerVerifiedPin from '../_components/ServerVerifiedPin/ServerVerifiedPin'; -import validate from 'validate.js'; -const SignUpStep = ({ setForm, formData, navigation }) => { +const SignUpStep = function({ setForm, formData, navigation }) { const dispatch = useDispatch(); + const [serverVerifiedPin, setServerVerifiedPin] = useState(); const { username, pin, nickname, credential } = formData; @@ -43,8 +46,8 @@ const SignUpStep = ({ setForm, formData, navigation }) => { console.log("register"); try { - let options = ""; // default = no platform or cross-platform preference - let userData = await WebAuthnClient.signUp(username, options, uv); + const options = ""; // default = no platform or cross-platform preference + const userData = await WebAuthnClient.signUp(username, uv); console.log("SignUpStep register userData: ", userData); if (userData === undefined) { @@ -63,12 +66,23 @@ const SignUpStep = ({ setForm, formData, navigation }) => { } } - function uv() { - //This is a user verifying platform. Skipping UV check. + const UVPromise = () => { + return new Promise((resolve, reject) => { + const svpinCreateProps = {type: "create", saveCallback: resolve, closeCallback: reject}; + console.log("SignUpStep UVPromise(): ", svpinCreateProps); + setServerVerifiedPin(); + }) + } + + async function uv(challengeResponse) { + dispatch(credentialActions.getUV(challengeResponse)); + const pinResult = await UVPromise(); + console.log("SignUpStep PIN Result: ", pinResult.value); + return pinResult.value; } const registerKeySuccessStep = (credential) => { - localStorage.setItem('credential', JSON.stringify(credential)); + localStorage.setItem("credential", JSON.stringify(credential)); console.log('registerKeySuccessStep credential ', credential); window.location.reload(); } @@ -81,14 +95,14 @@ const SignUpStep = ({ setForm, formData, navigation }) => { if (result) { setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); setValidated(false); - return; + } else { setErrors(errors => ({ ...errors, [name]: undefined })); setValidated(true); } } - const handleSubmit = (event) => { + const handleSubmit = async(event) => { const form = event.currentTarget; event.preventDefault(); @@ -100,12 +114,13 @@ const SignUpStep = ({ setForm, formData, navigation }) => { } if(isUsernameValid()) { - register(); + await register(); + history.push("/"); } } const isUsernameValid = () => { - if(validate({ username: username }, constraints)){ + if(validate({ username }, constraints)){ return false; } return true; @@ -151,13 +166,14 @@ const SignUpStep = ({ setForm, formData, navigation }) => {
-
+
Already have an account? Log In
+ {serverVerifiedPin} ); -}; +} export default SignUpStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/Credential/Credential.jsx b/clients/web/react/src/_components/Credential/Credential.jsx index 16be667..3c910bd 100644 --- a/clients/web/react/src/_components/Credential/Credential.jsx +++ b/clients/web/react/src/_components/Credential/Credential.jsx @@ -17,8 +17,10 @@ const Credential = function ({ credential }) {
{credential.credentialNickname.value}
-
YubiKey 5NFC
-

{credential.lastUsedTime.seconds}

+

+ Date Last used:{" "} + {new Date(credential.lastUsedTime.seconds * 1000).toLocaleString()} +

diff --git a/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.jsx b/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.jsx new file mode 100644 index 0000000..5dfa875 --- /dev/null +++ b/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.jsx @@ -0,0 +1,253 @@ +import React, { useState, useEffect, useRef } from "react"; + +import { useDispatch, useSelector } from "react-redux"; +import { Alert, Button, Card, Form, Modal, ModalBody } from "react-bootstrap"; +import { validate } from "validate.js"; +import { alertActions, credentialActions } from "../../_actions"; +import styles from "../component.module.css"; + +// props.type: "create" | "change" | "dispatch" [default] +// props.saveCallback: method to call on save, passes fields as the argument +const ServerVerifiedPin = function (props) { + const [pinCollection, setPinCollection] = useState({ + pin: "", + confirmPin: "", + }); + const finishUVRequest = useSelector( + (state) => state.credentials.finishUVRequest + ); + const [invalidPin, setInvalidPin] = useState(undefined); + const [invalidConfirmPin, setInvalidConfirmPin] = useState(undefined); + const [show, setShow] = useState(false); + const [showButton, setShowButton] = useState(false); + const [showConfirmPin, setShowConfirmPin] = useState(false); + const inputRef = useRef(null); + const inputRefNext = useRef(null); + const [label, setLabel] = useState({ + buttonText: "", + modalHeader: "", + modalText: "", + modalSubmitText: "", + }); + const constraints = { + pin: { + presence: true, + numericality: { + onlyInteger: true, + greaterThan: -1, + }, + length: { + minimum: 4, + maximum: 16, + }, + }, + confirmPin: { + equality: "pin", + }, + }; + + /** + * This method is used to configure the labels on the component depending on the type of UV dispatch that is sent from the parent component + * @param {*} type possible values are: + * create: Sent by the registration flow to create a new SVPIN upon initial registration + * change: Sent by the homepage when a user wants to change their SVPIN + * dispatch: Sent by login when a user needs to enter their SVPIN when logging into the service + */ + const configureModal = (type) => { + switch (type) { + case "create": + setLabel({ + buttonText: "", + modalHeader: "Create Server-Verified PIN", + modalText: "Please create a Server-Verified PIN", + modalSubmitText: "Submit PIN", + }); + setShowButton(false); + setShowConfirmPin(true); + break; + case "change": + setLabel({ + buttonText: "Change your Server-Verified PIN", + modalHeader: "Change your Server-Verified PIN", + modalText: "Enter your new PIN information", + modalSubmitText: "Change PIN", + }); + setShowButton(true); + setShowConfirmPin(true); + break; + case "dispatch": + setLabel({ + buttonText: "", + modalHeader: "Server-Verified PIN", + modalText: "Enter your Server-Verified PIN", + modalSubmitText: "Submit", + }); + setShowButton(false); + setShowConfirmPin(false); + break; + default: + setLabel({ + buttonText: "", + modalHeader: "", + modalText: "", + modalSubmitText: "", + }); + break; + } + }; + + const validForm = (currentPin, currentConfirmPin) => { + const pinResult = validate({ pin: currentPin }, constraints); + if (pinResult) { + setInvalidPin(pinResult.pin.join(". ")); + } else { + setInvalidPin(undefined); + } + + if (showConfirmPin) { + const confirmPinResult = validate( + { pin: currentConfirmPin }, + constraints + ); + if (confirmPinResult) { + setInvalidConfirmPin(confirmPinResult.pin.join(". ")); + } else { + setInvalidConfirmPin(undefined); + } + + const equalityResult = validate( + { pin: currentPin, confirmPin: currentConfirmPin }, + constraints + ); + if (equalityResult) { + if (!confirmPinResult) { + setInvalidConfirmPin(equalityResult.confirmPin.join(". ")); + } + } + + return !pinResult && !confirmPinResult && !equalityResult; + } + return !pinResult; + }; + + const handleShow = () => { + setShow(true); + }; + + const handleClose = () => { + props.closeCallback( + new Error( + "PIN Registration Ended - Please attempt to register your security key" + ) + ); + setShow(false); + }; + + const handleSave = () => { + if (validForm(pinCollection.pin, pinCollection.confirmPin)) { + props.saveCallback({ value: pinCollection.pin }); + handleClose(); + } + }; + + const handleChange = (e) => { + const { name, value } = e.target; + // eslint-disable-next-line no-shadow + setPinCollection((pinCollection) => ({ ...pinCollection, [name]: value })); + if (name === "pin") { + validForm(value, pinCollection.confirmPin); + } else if (name === "confirmPin") { + validForm(pinCollection.pin, value); + } + }; + + useEffect(() => { + configureModal(props.type); + }, []); + + useEffect(() => { + if (finishUVRequest !== undefined) { + console.log("showing sv-pin: ", finishUVRequest); + handleShow(); + } + }, [finishUVRequest]); + + return ( + <> + {showButton && ( + + + + )} + + + {label.modalHeader} + +
+ +

{label.modalText}

+ {/* Implement the main input for pin */} + Enter PIN + { + if (ev.key === "Enter") { + if (showConfirmPin) { + inputRefNext.current.focus(); + } else { + handleSave(); + } + ev.preventDefault(); + } + }} + /> + {invalidPin ? {invalidPin} : null} + {/* Implement the main input for confirmation PIN + This only appears if showConfirmPIn is set to true */} + {showConfirmPin && ( + <> + Confirm PIN + { + if (ev.key === "Enter") { + handleSave(); + ev.preventDefault(); + } + }} + /> + {invalidConfirmPin ? ( + {invalidConfirmPin} + ) : null} + + )} +
+ + + + +
+
+ + ); +}; + +export default ServerVerifiedPin; diff --git a/clients/web/react/src/_components/WebAuthnClient.js b/clients/web/react/src/_components/WebAuthnClient.js index 0d68d4a..7ee978f 100644 --- a/clients/web/react/src/_components/WebAuthnClient.js +++ b/clients/web/react/src/_components/WebAuthnClient.js @@ -1,306 +1,412 @@ -import { get, create, supported } from '@github/webauthn-json'; -import base64url from 'base64url'; -import cbor from 'cbor'; -import { Auth } from 'aws-amplify'; -import axios from 'axios'; +import { get, create, supported } from "@github/webauthn-json"; +import base64url from "base64url"; +import cbor from "cbor"; +import { Auth } from "aws-amplify"; +import axios from "axios"; -import aws_exports from '../aws-exports'; +import aws_exports from "../aws-exports"; axios.defaults.baseURL = aws_exports.apiEndpoint; export const WebAuthnClient = { - getAuthChallegeResponse, - getPublicKeyRequestOptions, - getUsernamelessAuthChallegeResponse, - getUVFromAssertion, - sendChallengeAnswer, - signIn, - signUp + getAuthChallegeResponse, + getPublicKeyRequestOptions, + getUsernamelessAuthChallegeResponse, + getUVFromAssertion, + sendChallengeAnswer, + signIn, + signUp, }; const defaultInvalidPIN = -1; -const webAuthnClientExceptionName = 'WebAuthnClientException'; +const webAuthnClientExceptionName = "WebAuthnClientException"; const ERROR_CODE = "ERROR_CODE"; const INVALID_CHALLENGE_TYPE = "INVALID_CHALLENGE_TYPE"; - function WebAuthnClientException(message, code = ERROR_CODE) { - const error = new Error(message); - error.code = code; - error.name = webAuthnClientExceptionName; - return error; + const error = new Error(message); + error.code = code; + error.name = webAuthnClientExceptionName; + return error; } async function getPublicKeyRequestOptions() { - try { - const response = await axios.get('/users/credentials/fido2/authenticate'); - console.log("WebAuthnClient getPublicKeyRequestOptions() response: ", response); - return response.data; - } catch (error) { - console.error("WebAuthnClient getPublicKeyRequestOptions() error: ", error); - throw error; - } + try { + const response = await axios.get("/users/credentials/fido2/authenticate"); + console.log( + "WebAuthnClient getPublicKeyRequestOptions() response: ", + response + ); + return response.data; + } catch (error) { + console.error("WebAuthnClient getPublicKeyRequestOptions() error: ", error); + throw error; + } } async function getUsernamelessAuthChallegeResponse() { - try { - const requestOptions = getPublicKeyRequestOptions(); - - const publicKey = { "publicKey": requestOptions.publicKeyCredentialRequestOptions }; - console.log("WebAuthnClient getUsernamelessAuthChallegeResponse() publicKey: ", publicKey); - - let assertionResponse = await get(publicKey); - console.log("WebAuthnClient getUsernamelessAuthChallegeResponse() assertionResponse: ", assertionResponse); - - const userhandle = assertionResponse.response.userHandle; //Sign in to Amazon Cognito with userhandle as the `username` - console.log("WebAuthnClient getUsernamelessAuthChallegeResponse() userhandle: ", userhandle); - - let challengeResponse = { - credential: assertionResponse, - requestId: requestOptions.requestId, - pinCode: defaultInvalidPIN - }; - console.log("WebAuthnClient getUsernamelessAuthChallegeResponse() challengeResponse: ", challengeResponse); - - return (challengeResponse, userhandle); + try { + const requestOptions = getPublicKeyRequestOptions(); - } catch (error) { - console.error("WebAuthnClient getUsernamelessAuthChallegeResponse() error: ", error); - throw error; - } + const publicKey = { + publicKey: requestOptions.publicKeyCredentialRequestOptions, + }; + console.log( + "WebAuthnClient getUsernamelessAuthChallegeResponse() publicKey: ", + publicKey + ); + + const assertionResponse = await get(publicKey); + console.log( + "WebAuthnClient getUsernamelessAuthChallegeResponse() assertionResponse: ", + assertionResponse + ); + + const userhandle = assertionResponse.response.userHandle; // Sign in to Amazon Cognito with userhandle as the `username` + console.log( + "WebAuthnClient getUsernamelessAuthChallegeResponse() userhandle: ", + userhandle + ); + + const challengeResponse = { + credential: assertionResponse, + requestId: requestOptions.requestId, + pinCode: defaultInvalidPIN, + }; + console.log( + "WebAuthnClient getUsernamelessAuthChallegeResponse() challengeResponse: ", + challengeResponse + ); + + return challengeResponse, userhandle; + } catch (error) { + console.error( + "WebAuthnClient getUsernamelessAuthChallegeResponse() error: ", + error + ); + throw error; + } } async function getAuthChallegeResponse(cognitoChallenge) { - try { - console.log("WebAuthnClient getAuthChallegeResponse() cognitoChallenge response: " + JSON.stringify(cognitoChallenge, null, 2)); - - const request = JSON.parse(cognitoChallenge.publicKeyCredentialRequestOptions); - console.log("WebAuthnClient getAuthChallegeResponse() request: ", request); - - const publicKey = { "publicKey": request.publicKeyCredentialRequestOptions }; - console.log("WebAuthnClient getAuthChallegeResponse() publicKey: ", publicKey); - - let assertionResponse = await get(publicKey); - console.log("WebAuthnClient getAuthChallegeResponse() assertion response: " + JSON.stringify(assertionResponse)); - - let challengeResponse = { - credential: assertionResponse, - requestId: request.requestId, - pinCode: defaultInvalidPIN - }; - console.log("WebAuthnClient getAuthChallegeResponse() challengeResponse: ", challengeResponse); - - return challengeResponse; - - } catch (error) { - console.error("WebAuthnClient getAuthChallegeResponse() error: ", error); - throw error; - } + try { + console.log( + `WebAuthnClient getAuthChallegeResponse() cognitoChallenge response: ${JSON.stringify( + cognitoChallenge, + null, + 2 + )}` + ); + + const request = JSON.parse( + cognitoChallenge.publicKeyCredentialRequestOptions + ); + console.log("WebAuthnClient getAuthChallegeResponse() request: ", request); + + const publicKey = { publicKey: request.publicKeyCredentialRequestOptions }; + console.log( + "WebAuthnClient getAuthChallegeResponse() publicKey: ", + publicKey + ); + + const assertionResponse = await get(publicKey); + console.log( + `WebAuthnClient getAuthChallegeResponse() assertion response: ${JSON.stringify( + assertionResponse + )}` + ); + + const challengeResponse = { + credential: assertionResponse, + requestId: request.requestId, + pinCode: defaultInvalidPIN, + }; + console.log( + "WebAuthnClient getAuthChallegeResponse() challengeResponse: ", + challengeResponse + ); + + return challengeResponse; + } catch (error) { + console.error("WebAuthnClient getAuthChallegeResponse() error: ", error); + throw error; + } } async function getCreateCredentialChallegeResponse(cognitoChallenge) { - try { - console.log("WebAuthnClient getCreateCredentialChallegeResponse() cognitoChallenge response: " + JSON.stringify(cognitoChallenge, null, 2)); - - const request = JSON.parse(cognitoChallenge.publicKeyCredentialCreationOptions); - console.log("WebAuthnClient getCreateCredentialChallegeResponse() request: ", request); - - const publicKey = { "publicKey": request.publicKeyCredentialCreationOptions }; - console.log("WebAuthnClient getCreateCredentialChallegeResponse() publicKey: ", publicKey); - - let attestationResponse = await create(publicKey); - console.log("WebAuthnClient getCreateCredentialChallegeResponse() attestationResponse: " + JSON.stringify(attestationResponse)); - - let challengeResponse = { - credential: attestationResponse, - requestId: request.requestId, - pinCode: defaultInvalidPIN - }; - console.log("WebAuthnClient getCreateCredentialChallegeResponse() challengeResponse: ", challengeResponse); - - return challengeResponse; - - } catch (error) { - console.error("WebAuthnClient getCreateCredentialChallegeResponse() error: ", error); - throw error; - } + try { + console.log( + `WebAuthnClient getCreateCredentialChallegeResponse() cognitoChallenge response: ${JSON.stringify( + cognitoChallenge, + null, + 2 + )}` + ); + + const request = JSON.parse( + cognitoChallenge.publicKeyCredentialCreationOptions + ); + console.log( + "WebAuthnClient getCreateCredentialChallegeResponse() request: ", + request + ); + + const publicKey = { publicKey: request.publicKeyCredentialCreationOptions }; + console.log( + "WebAuthnClient getCreateCredentialChallegeResponse() publicKey: ", + publicKey + ); + + const attestationResponse = await create(publicKey); + console.log( + `WebAuthnClient getCreateCredentialChallegeResponse() attestationResponse: ${JSON.stringify( + attestationResponse + )}` + ); + + const challengeResponse = { + credential: attestationResponse, + requestId: request.requestId, + pinCode: defaultInvalidPIN, + }; + console.log( + "WebAuthnClient getCreateCredentialChallegeResponse() challengeResponse: ", + challengeResponse + ); + + return challengeResponse; + } catch (error) { + console.error( + "WebAuthnClient getCreateCredentialChallegeResponse() error: ", + error + ); + throw error; + } } function getUVFromAssertion(authenticatorData) { - let buffer = base64url.toBuffer(authenticatorData); + const buffer = base64url.toBuffer(authenticatorData); - return getUV(buffer); + return getUV(buffer); } function getUVFromAttestation(attestationObject) { - let attestationBuffer = base64url.toBuffer(attestationObject); - let attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; - let buffer = attestationStruct.authData; - - return getUV(buffer); -} + const attestationBuffer = base64url.toBuffer(attestationObject); + const attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; + const buffer = attestationStruct.authData; -function getUV(buffer){ - let flagsBuf = buffer.slice(32, 33); - let flagsInt = flagsBuf[0]; - let flags = { - up: !!(flagsInt & 0x01), - uv: !!(flagsInt & 0x04), - at: !!(flagsInt & 0x40), - ed: !!(flagsInt & 0x80), - flagsInt - }; - return flags.uv; + return getUV(buffer); } -async function signIn(name, options, requestUV) { - console.log("WebAuthnClient signIn() name=", name); - - try { - - let username = undefined; - let challengeResponse = undefined; - - if (name === undefined) { - console.log("WebAuthnClient signIn() usernameless flow"); - challengeResponse, username = await getUsernamelessAuthChallegeResponse(); - } else { - console.log("WebAuthnClient signIn() username flow"); - username = name.toLocaleLowerCase(); - localStorage.setItem('username', username); - } - - let cognitoUser = await Auth.signIn(username); - console.log("WebAuthnClient signIn() CognitoUser: ", cognitoUser); - - if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.create') { - - throw new WebAuthnClientException("User not found. Please Sign Up.", INVALID_CHALLENGE_TYPE); - - } else if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.get') { - - if (challengeResponse === undefined) { - console.log("WebAuthnClient signIn() get challenge response for username flow"); - challengeResponse = await getAuthChallegeResponse(cognitoUser.challengeParam); - } - console.log("WebAuthnClient signIn() challengeResponse: ", challengeResponse); - - let isUserVerified = getUVFromAssertion(challengeResponse.credential.response.authenticatorData); - console.log("WebAuthnClient signIn() isUserVerified: ", isUserVerified); - - let pin = defaultInvalidPIN; - if (isUserVerified == false) { - console.log("WebAuthnClient signIn() requesting UV: "); - pin = requestUV(); - } - - console.log("WebAuthnClient signIn() sending challenge answer"); - let userData = await sendChallengeAnswer(cognitoUser, challengeResponse, pin); - - return userData; - - } else { - //TODO move dispatch to UI logic - //dispatch(alertActions.error("Invalid server response")); - console.error("WebAuthnClient signIn() error: throw WebAuthnClientException"); - throw new WebAuthnClientException("Invalid server response"); - } - } catch (error) { - console.error("WebAuthnClient signIn() error: ", error); - //TODO move dispatch to UI logic - //dispatch(alertActions.error(err.message)); - throw error; - } +function getUV(buffer) { + const flagsBuf = buffer.slice(32, 33); + const flagsInt = flagsBuf[0]; + const flags = { + up: !!(flagsInt & 0x01), + uv: !!(flagsInt & 0x04), + at: !!(flagsInt & 0x40), + ed: !!(flagsInt & 0x80), + flagsInt, + }; + return flags.uv; } -async function sendChallengeAnswer(cognitoUser, challengeResponse, pin = defaultInvalidPIN) { - challengeResponse.pinCode = parseInt(pin); - console.log("WebAuthnClient sendChallengeAnswer(): ", challengeResponse); - - let userData = undefined; - - try { - let user = await Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)); - console.log("WebAuthnClient sendChallengeAnswer user: ", user); - - userData = { - id: 1, - username: user.username, - credential: challengeResponse.credential, - } - localStorage.setItem('user', JSON.stringify(userData)); - console.log("WebAuthnClient sendChallengeAnswer userData: ", localStorage.getItem('user')); - - } catch (error) { - console.error("WebAuthnClient sendCustomChallengeAnswer() error: ", error); - //TODO move dispatch to UI logic - //dispatch(alertActions.error(err.message)); - throw error; +async function signIn(name, requestUV) { + console.log("WebAuthnClient signIn() name=", name); + + try { + let username; + let challengeResponse; + + if (name === undefined) { + console.log("WebAuthnClient signIn() usernameless flow"); + challengeResponse, + (username = await getUsernamelessAuthChallegeResponse()); + } else { + console.log("WebAuthnClient signIn() username flow"); + username = name.toLocaleLowerCase(); + localStorage.setItem("username", username); } - return userData; -} - - -async function signUp(name, requestUV) { - console.log("WebAuthnClient signUp() name=", name); - - // Start Registration - // First, Cognito needs to make an account for the user - const randomString = (length) => [...Array(length)].map(() => (Math.floor(Math.random() * 36)).toString(36)).join(''); - const password = randomString(14); - const username = name.toLocaleLowerCase(); - localStorage.setItem('username', username); - const attributes = { name: username }; - - try { - const { user } = await Auth.signUp({ - username, - password, - attributes - }); - console.log("SignUp: ", user); - } catch (error) { - // A user can get here if they come back to register after the initial registration was interrupted - console.log(error); + const cognitoUser = await Auth.signIn(username); + console.log("WebAuthnClient signIn() CognitoUser: ", cognitoUser); + + if ( + cognitoUser.challengeName === "CUSTOM_CHALLENGE" && + cognitoUser.challengeParam.type === "webauthn.create" + ) { + throw new WebAuthnClientException( + "User not found. Please Sign Up.", + INVALID_CHALLENGE_TYPE + ); + } else if ( + cognitoUser.challengeName === "CUSTOM_CHALLENGE" && + cognitoUser.challengeParam.type === "webauthn.get" + ) { + if (challengeResponse === undefined) { + console.log( + "WebAuthnClient signIn() get challenge response for username flow" + ); + challengeResponse = await getAuthChallegeResponse( + cognitoUser.challengeParam + ); + } + console.log( + "WebAuthnClient signIn() challengeResponse: ", + challengeResponse + ); + + const isUserVerified = getUVFromAssertion( + challengeResponse.credential.response.authenticatorData + ); + console.log("WebAuthnClient signIn() isUserVerified: ", isUserVerified); + + let pin = defaultInvalidPIN; + if (isUserVerified == false) { + console.log("WebAuthnClient signIn() requesting UV: "); + pin = await requestUV(challengeResponse); + } + + console.log("WebAuthnClient signIn() sending challenge answer"); + const userData = await sendChallengeAnswer( + cognitoUser, + challengeResponse, + pin + ); + + return userData; + } else { + // TODO move dispatch to UI logic + // dispatch(alertActions.error("Invalid server response")); + console.error( + "WebAuthnClient signIn() error: throw WebAuthnClientException" + ); + throw new WebAuthnClientException("Invalid server response"); } + } catch (error) { + console.error("WebAuthnClient signIn() error: ", error); + // TODO move dispatch to UI logic + // dispatch(alertActions.error(err.message)); + throw error; + } +} - // Second, register a webauthn credential associated with the user account - try { - let cognitoUser = await Auth.signIn(username); - console.log("WebAuthnClient signUp() CognitoUser: ", cognitoUser); - - if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.get') { - - throw new WebAuthnClientException("User already exists. Please Sign In.", INVALID_CHALLENGE_TYPE); - - } else if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.create') { - - let challengeResponse = await getCreateCredentialChallegeResponse(cognitoUser.challengeParam); - console.log("WebAuthnClient signUp() challengeResponse: ", challengeResponse); +async function sendChallengeAnswer( + cognitoUser, + challengeResponse, + pin = defaultInvalidPIN +) { + challengeResponse.pinCode = parseInt(pin); + console.log("WebAuthnClient sendChallengeAnswer(): ", challengeResponse); - let isUserVerified = getUVFromAttestation(challengeResponse.credential.response.attestationObject); - console.log("WebAuthnClient signUp() isUserVerified: ", isUserVerified); + let userData; - let pin = defaultInvalidPIN; - if (isUserVerified == false) { - console.log("WebAuthnClient signUp() requesting UV: "); - pin = requestUV(); - } + try { + const user = await Auth.sendCustomChallengeAnswer( + cognitoUser, + JSON.stringify(challengeResponse) + ); - console.log("WebAuthnClient signUp() sending challenge answer"); - let userData = await sendChallengeAnswer(cognitoUser, challengeResponse, pin); - console.log("WebAuthnClient signUp() userData: ",userData); + console.log("WebAuthnClient sendChallengeAnswer user: ", user); - return userData; + userData = { + id: 1, + username: user.username, + credential: challengeResponse.credential, + }; + localStorage.setItem("user", JSON.stringify(userData)); + console.log( + "WebAuthnClient sendChallengeAnswer userData: ", + localStorage.getItem("user") + ); + } catch (error) { + console.error("WebAuthnClient sendCustomChallengeAnswer() error: ", error); + // TODO move dispatch to UI logic + // dispatch(alertActions.error(err.message)); + throw error; + } + return userData; +} - } else { - console.error("WebAuthnClient signUp() error: throw WebAuthnClientException"); - throw new WebAuthnClientException("Invalid server response"); - } - } catch (error) { - console.error("WebAuthnClient signUp() error: ", error); - throw error; +async function signUp(name, requestUV) { + console.log("WebAuthnClient signUp() name=", name); + + // Start Registration + // First, Cognito needs to make an account for the user + const randomString = (length) => + [...Array(length)] + .map(() => Math.floor(Math.random() * 36).toString(36)) + .join(""); + const password = randomString(14); + const username = name.toLocaleLowerCase(); + localStorage.setItem("username", username); + const attributes = { name: username }; + + try { + const { user } = await Auth.signUp({ + username, + password, + attributes, + }); + console.log("SignUp: ", user); + } catch (error) { + // A user can get here if they come back to register after the initial registration was interrupted + console.log(error); + } + + // Second, register a webauthn credential associated with the user account + try { + const cognitoUser = await Auth.signIn(username); + console.log("WebAuthnClient signUp() CognitoUser: ", cognitoUser); + + if ( + cognitoUser.challengeName === "CUSTOM_CHALLENGE" && + cognitoUser.challengeParam.type === "webauthn.get" + ) { + throw new WebAuthnClientException( + "User already exists. Please Sign In.", + INVALID_CHALLENGE_TYPE + ); + } else if ( + cognitoUser.challengeName === "CUSTOM_CHALLENGE" && + cognitoUser.challengeParam.type === "webauthn.create" + ) { + const challengeResponse = await getCreateCredentialChallegeResponse( + cognitoUser.challengeParam + ); + console.log( + "WebAuthnClient signUp() challengeResponse: ", + challengeResponse + ); + + const isUserVerified = getUVFromAttestation( + challengeResponse.credential.response.attestationObject + ); + console.log("WebAuthnClient signUp() isUserVerified: ", isUserVerified); + + let pin = defaultInvalidPIN; + if (isUserVerified == false) { + console.log("WebAuthnClient signUp() requesting UV: "); + pin = await requestUV(challengeResponse); + } + + console.log("WebAuthnClient signUp() sending challenge answer"); + const userData = await sendChallengeAnswer( + cognitoUser, + challengeResponse, + pin + ); + console.log("WebAuthnClient signUp() userData: ", userData); + + return userData; + } else { + console.error( + "WebAuthnClient signUp() error: throw WebAuthnClientException" + ); + throw new WebAuthnClientException("Invalid server response"); } - + } catch (error) { + console.error("WebAuthnClient signUp() error: ", error); + throw error; + } } From 53f60e26b6008e35bcd4ccc67722ac2e62a8ff34 Mon Sep 17 00:00:00 2001 From: csalas Date: Fri, 3 Dec 2021 15:40:20 -0600 Subject: [PATCH 27/66] Fixed initial login token issue --- clients/web/react/src/HomePage/HomePage.jsx | 46 ++++++++------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 7c02907..261a879 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import { Button, Card, InputGroup, FormControl, Table } from "react-bootstrap"; +import { Auth } from "aws-amplify"; import { userActions, credentialActions } from "../_actions"; import { history } from "../_helpers"; import CredentialList from "../_components/Credential/CredentialList"; @@ -10,6 +11,7 @@ import styles from "../_components/component.module.css"; const HomePage = function () { const authentication = useSelector((state) => state.authentication); + const [jwt, setjwt] = useState(""); const credentials = useSelector((state) => state.credentials); const [credentialItems, setCredentialItems] = useState([]); @@ -18,12 +20,18 @@ const HomePage = function () { recoveryCodesViewed: false, }); const [credentialsLoading, setCredentialsLoading] = useState(true); - const alert = useSelector((state) => state.alert); const dispatch = useDispatch(); - function currentAuthenticatedUser() { - dispatch(userActions.getCurrentAuthenticatedUser()); + async function currentAuthenticatedUser() { + // dispatch(userActions.getCurrentAuthenticatedUser()); + const data = await Auth.currentSession(); + const token = data.getIdToken().getJwtToken(); + if (token) { + setjwt(token); + } else { + console.error("There was an error getting your current user session"); + } } useEffect(() => { @@ -46,32 +54,16 @@ const HomePage = function () { } }, [credentials]); + // This method is fine useEffect(() => { - dispatch(credentialActions.getAll(authentication.user.token)); - }, [jwt]); - - useEffect(() => { - if (!jwt && authentication.user.token) { - setjwt(authentication.user.token); + if (jwt) { + console.log("Using JWT to call to getAll()"); + dispatch(credentialActions.getAll(jwt)); } - }, [authentication, alert]); - - useEffect(() => { - setTimeout(() => { - if (authentication.user.token !== undefined) { - console.log( - "Calling get all with credential: ", - authentication.user.token - ); - dispatch(credentialActions.getAll(authentication.user.token)); - } - }, 2000); - }, []); + }, [jwt]); useEffect(() => { - // window.location.reload(); - setTimeout(() => currentAuthenticatedUser(), 300); - // currentAuthenticatedUser(); + currentAuthenticatedUser(); }, []); const logout = async () => { @@ -193,9 +185,7 @@ const HomePage = function () { ) : ( )} - {authentication.user.token && ( - - )} + {jwt && }

From 8351722cfeeadbdbfb837f3c21bcdab36074ce7c Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 6 Dec 2021 10:48:57 -0600 Subject: [PATCH 28/66] Change SVPIN added to home page, and some other code refactoring --- clients/web/react/src/HomePage/HomePage.jsx | 27 +++++++++++++++---- .../_components/Credential/CredentialList.jsx | 2 +- .../ServerVerifiedPin/ServerVerifiedPin.jsx | 3 ++- .../_components/ServerVerifiedPin/index.js | 3 +++ 4 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 clients/web/react/src/_components/ServerVerifiedPin/index.js diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 261a879..736474e 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -4,14 +4,14 @@ import { Button, Card, InputGroup, FormControl, Table } from "react-bootstrap"; import { Auth } from "aws-amplify"; import { userActions, credentialActions } from "../_actions"; import { history } from "../_helpers"; -import CredentialList from "../_components/Credential/CredentialList"; -import { RecoveryCodes } from "../_components/RecoveryCodes/RecoveryCodes"; -import { DeleteUser } from "../_components/DeleteUser/DeleteUser"; +import { CredentialList } from "../_components/Credential"; +import { RecoveryCodes } from "../_components/RecoveryCodes"; +import { DeleteUser } from "../_components/DeleteUser"; +import ServerVerifiedPin from "../_components/ServerVerifiedPin/ServerVerifiedPin"; import styles from "../_components/component.module.css"; const HomePage = function () { const authentication = useSelector((state) => state.authentication); - const [jwt, setjwt] = useState(""); const credentials = useSelector((state) => state.credentials); const [credentialItems, setCredentialItems] = useState([]); @@ -20,9 +20,23 @@ const HomePage = function () { recoveryCodesViewed: false, }); const [credentialsLoading, setCredentialsLoading] = useState(true); - const dispatch = useDispatch(); + function svpCallback(newValue) { + const fields = { pin: newValue.value, confirmPin: newValue.value }; + dispatch(credentialActions.updatePin(fields)); + } + + function svpCloseCallback(message) { + console.warn(message); + } + + const serverVerifiedProps = { + type: "change", + saveCallback: svpCallback, + closeCallback: svpCloseCallback, + }; + async function currentAuthenticatedUser() { // dispatch(userActions.getCurrentAuthenticatedUser()); const data = await Auth.currentSession(); @@ -140,6 +154,8 @@ const HomePage = function () {
Server Verified PIN
+ + {/** @@ -178,6 +194,7 @@ const HomePage = function () { /> + */} {credentialsLoading ? ( diff --git a/clients/web/react/src/_components/Credential/CredentialList.jsx b/clients/web/react/src/_components/Credential/CredentialList.jsx index 5f5b067..b922c76 100644 --- a/clients/web/react/src/_components/Credential/CredentialList.jsx +++ b/clients/web/react/src/_components/Credential/CredentialList.jsx @@ -23,4 +23,4 @@ const CredentialList = function ({ credentialItems }) { ); }; -export default CredentialList; +export { CredentialList }; diff --git a/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.jsx b/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.jsx index 5dfa875..889eae3 100644 --- a/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.jsx +++ b/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.jsx @@ -8,6 +8,7 @@ import styles from "../component.module.css"; // props.type: "create" | "change" | "dispatch" [default] // props.saveCallback: method to call on save, passes fields as the argument +// props.closeCallback: method to call when closing the flow, is used to reject a promise const ServerVerifiedPin = function (props) { const [pinCollection, setPinCollection] = useState({ pin: "", @@ -166,7 +167,7 @@ const ServerVerifiedPin = function (props) { }, []); useEffect(() => { - if (finishUVRequest !== undefined) { + if (finishUVRequest !== undefined && props.type !== "change") { console.log("showing sv-pin: ", finishUVRequest); handleShow(); } diff --git a/clients/web/react/src/_components/ServerVerifiedPin/index.js b/clients/web/react/src/_components/ServerVerifiedPin/index.js new file mode 100644 index 0000000..2c45b9a --- /dev/null +++ b/clients/web/react/src/_components/ServerVerifiedPin/index.js @@ -0,0 +1,3 @@ +import ServerVerifiedPin from "./ServerVerifiedPin"; + +export default ServerVerifiedPin; From 19170810eccb3c6c27c302acd4a1b237101e802f Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 6 Dec 2021 11:32:01 -0600 Subject: [PATCH 29/66] SVPIN registration works on Add Credential --- .../_components/Credential/AddCredential.jsx | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/clients/web/react/src/_components/Credential/AddCredential.jsx b/clients/web/react/src/_components/Credential/AddCredential.jsx index ef5f758..29849ec 100644 --- a/clients/web/react/src/_components/Credential/AddCredential.jsx +++ b/clients/web/react/src/_components/Credential/AddCredential.jsx @@ -8,6 +8,7 @@ import axios from "axios"; import validate from "validate.js"; import { useDispatch } from "react-redux"; import { credentialActions, alertActions } from "../../_actions"; +import ServerVerifiedPin from "../ServerVerifiedPin/ServerVerifiedPin"; // eslint-disable-next-line camelcase import aws_exports from "../../aws-exports"; @@ -16,6 +17,7 @@ axios.defaults.baseURL = aws_exports.apiEndpoint; const AddCredential = function () { const [showAdd, setShowAdd] = useState(false); + const [serverVerifiedPin, setServerVerifiedPin] = useState(); const [nickname, setNickname] = useState(""); const [isResidentKey, setIsResidentKey] = useState(false); const [invalidNickname, setInvalidNickname] = useState(undefined); @@ -72,7 +74,26 @@ const AddCredential = function () { return flags.uv; } - const register = () => { + const UVPromise = () => { + return new Promise((resolve, reject) => { + const svpinCreateProps = { + type: "create", + saveCallback: resolve, + closeCallback: reject, + }; + console.log("SignUpStep UVPromise(): ", svpinCreateProps); + setServerVerifiedPin(); + }); + }; + + async function registerUV(challengeResponse) { + dispatch(credentialActions.getUV(challengeResponse)); + const pinResult = await UVPromise(); + console.log("SignUpStep PIN Result: ", pinResult.value); + return pinResult.value; + } + + const register = async () => { console.log("register"); console.log("nickname: ", nickname); @@ -81,7 +102,7 @@ const AddCredential = function () { nickname, requireResidentKey: isResidentKey, }) - .then((startRegistrationResponse) => { + .then(async (startRegistrationResponse) => { console.log(startRegistrationResponse); const { requestId } = startRegistrationResponse.data; @@ -93,7 +114,7 @@ const AddCredential = function () { console.log("publlicKey: ", publicKey); create(publicKey) - .then((makeCredentialResponse) => { + .then(async (makeCredentialResponse) => { console.log( `make credential response: ${JSON.stringify( makeCredentialResponse @@ -114,12 +135,13 @@ const AddCredential = function () { console.log("challengeResponse: ", challengeResponse); if (uv === true) { - if (uv === true) { - console.log("finishRegistration: ", challengeResponse); - dispatch(credentialActions.registerFinish(challengeResponse)); - } else { - dispatch(credentialActions.getUV(challengeResponse)); - } + console.log("finishRegistration: ", challengeResponse); + dispatch(credentialActions.registerFinish(challengeResponse)); + } else { + const uvPin = await registerUV(challengeResponse); + console.log("AddCredential, new Key PIN is: ", uvPin); + challengeResponse.pinCode = uvPin; + dispatch(credentialActions.registerFinish(challengeResponse)); } }) .catch((error) => { @@ -198,6 +220,7 @@ const AddCredential = function () { + {serverVerifiedPin} ); }; From a0c6d21132002172002c4e8fd8be2a7b79f87c37 Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 6 Dec 2021 12:12:40 -0600 Subject: [PATCH 30/66] Fixed issue where key list not refreshing on Add/Delete --- clients/web/react/src/HomePage/HomePage.jsx | 69 +++++++-------------- 1 file changed, 23 insertions(+), 46 deletions(-) diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.jsx index 736474e..d6822f4 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.jsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; -import { Button, Card, InputGroup, FormControl, Table } from "react-bootstrap"; +import { Button, Card, Spinner, Table } from "react-bootstrap"; import { Auth } from "aws-amplify"; import { userActions, credentialActions } from "../_actions"; import { history } from "../_helpers"; @@ -11,9 +11,9 @@ import ServerVerifiedPin from "../_components/ServerVerifiedPin/ServerVerifiedPi import styles from "../_components/component.module.css"; const HomePage = function () { - const authentication = useSelector((state) => state.authentication); const [jwt, setjwt] = useState(""); const credentials = useSelector((state) => state.credentials); + const alert = useSelector((state) => state.alert); const [credentialItems, setCredentialItems] = useState([]); const [recoveryCodeProps, setRecoveryCodeProps] = useState({ allRecoveryCodesUsed: false, @@ -66,12 +66,23 @@ const HomePage = function () { } setCredentialsLoading(false); } - }, [credentials]); + }, [credentials, alert]); + + useEffect(() => { + if (alert.message) { + console.warn("*****In here ******"); + if ( + alert.message === "Registration successful" || + alert.message === "Delete credential successful" + ) { + dispatch(credentialActions.getAll(jwt)); + } + } + }, [alert]); // This method is fine useEffect(() => { if (jwt) { - console.log("Using JWT to call to getAll()"); dispatch(credentialActions.getAll(jwt)); } }, [jwt]); @@ -145,7 +156,10 @@ const HomePage = function () { {credentialsLoading ? ( -

Loading

+
+ +

Getting your security keys!

+
) : ( )} @@ -155,50 +169,13 @@ const HomePage = function () { - {/** - - - - Old PIN         - - - - - - - - New PIN       - - - - - - - Confirm PIN - - - - - */} {credentialsLoading ? ( -

Loading

+
+ +

Getting your recovery codes!

+
) : ( )} From 080df6dc6d7feb2ad3f41273634946bcbc78ed90 Mon Sep 17 00:00:00 2001 From: csalas Date: Wed, 8 Dec 2021 13:25:14 -0600 Subject: [PATCH 31/66] Recovery code login fixed --- clients/web/react/src/LoginPage/LogInStep.js | 188 +------------------ 1 file changed, 3 insertions(+), 185 deletions(-) diff --git a/clients/web/react/src/LoginPage/LogInStep.js b/clients/web/react/src/LoginPage/LogInStep.js index cd1287a..3b882d4 100644 --- a/clients/web/react/src/LoginPage/LogInStep.js +++ b/clients/web/react/src/LoginPage/LogInStep.js @@ -1,15 +1,13 @@ -import React, { useState, useEffect, useContext } from "react"; +import React, { useState, useEffect } from "react"; import { Button, InputGroup, Form, Spinner } from "react-bootstrap"; import { useDispatch, useSelector } from "react-redux"; -import { get, supported } from "@github/webauthn-json"; import base64url from "base64url"; -import { Auth } from "aws-amplify"; import validate from "validate.js"; import { WebAuthnClient } from "../_components"; import ServerVerifiedPin from "../_components/ServerVerifiedPin/ServerVerifiedPin"; import { history } from "../_helpers"; -import { userActions, credentialActions, alertActions } from "../_actions"; +import { credentialActions, alertActions } from "../_actions"; import styles from "../_components/component.module.css"; @@ -23,11 +21,9 @@ const LogInStep = function ({ navigation }) { username: "", }); const [validated, setValidated] = useState(false); - const [cognitoUser, setCognitoUser] = useState({}); const webAuthnStartResponse = useSelector( (state) => state.authentication.webAuthnStartResponse ); - const defaultInvalidPIN = -1; const [continueSubmitted, setContinueSubmitted] = useState(false); const [serverVerifiedPin, setServerVerifiedPin] = useState(); @@ -48,19 +44,6 @@ const LogInStep = function ({ navigation }) { const dispatch = useDispatch(); - // reset login status - /* useEffect(() => { - dispatch(userActions.logout()); - - if(inputs.username) { - signInWithUsername(); - } else { - setContinueSubmitted(true); - dispatch(userActions.webAuthnStart()); - } - - }, []); */ - useEffect(() => { if (webAuthnStartResponse) { signInWithoutUsername(); @@ -123,114 +106,6 @@ const LogInStep = function ({ navigation }) { } } - /* - async function signIn(name) { - console.log("signIn ", name); - setContinueSubmitted(true); - - const lowercaseName = name.toLocaleLowerCase(); - - localStorage.setItem("username", lowercaseName); - - try { - const cognitoUser = await Auth.signIn(lowercaseName); - setCognitoUser(cognitoUser); - console.log("SignIn CognitoUser: ", cognitoUser); - - if ( - cognitoUser.challengeName === "CUSTOM_CHALLENGE" && - cognitoUser.challengeParam.type === "webauthn.create" - ) { - dispatch(alertActions.error("Please Sign Up")); - history.push("/register"); - return; - } - if ( - cognitoUser.challengeName === "CUSTOM_CHALLENGE" && - cognitoUser.challengeParam.type === "webauthn.get" - ) { - console.log( - `assertion request: ${JSON.stringify( - cognitoUser.challengeParam, - null, - 2 - )}` - ); - - const request = JSON.parse( - cognitoUser.challengeParam.publicKeyCredentialRequestOptions - ); - console.log("request: ", request); - - const publicKey = { - publicKey: request.publicKeyCredentialRequestOptions, - }; - console.log("publicKey: ", publicKey); - - const assertionResponse = await get(publicKey); - console.log(`assertion response: ${JSON.stringify(assertionResponse)}`); - - const uv = getUV(assertionResponse.response.authenticatorData); - console.log(`uv: ${uv}`); - - const challengeResponse = { - credential: assertionResponse, - requestId: request.requestId, - pinCode: defaultInvalidPIN, - }; - console.log("challengeResponse: ", challengeResponse); - - if (uv == false) { - dispatch(credentialActions.getUV(challengeResponse)); - } else { - console.log("sending Custom Challenge Answer"); - // to send the answer of the custom challenge - Auth.sendCustomChallengeAnswer( - cognitoUser, - JSON.stringify(challengeResponse) - ) - .then((user) => { - console.log(user); - - Auth.currentSession() - .then((data) => { - dispatch(alertActions.success("Authentication successful")); - const userData = { - id: 1, - username: user.attributes.name, - token: data.getAccessToken().getJwtToken(), - }; - localStorage.setItem("user", JSON.stringify(userData)); - console.log("userData ", localStorage.getItem("user")); - - registerTrustedDeviceOrContinue("/"); - }) - .catch((err) => { - console.error("currentSession error: ", err); - dispatch( - alertActions.error("Something went wrong. ", err.message) - ); - setContinueSubmitted(false); - }); - }) - .catch((err) => { - console.error("sendCustomChallengeAnswer error: ", err); - dispatch(alertActions.error(err.message)); - }); - } - } else { - setContinueSubmitted(false); - dispatch(alertActions.error("Invalid server response")); - } - } catch (err) { - console.error("signIn error"); - console.error(err); - setContinueSubmitted(false); - dispatch(alertActions.error(err.message)); - } - } - */ - function registerTrustedDeviceOrContinue(path) { const trustedDevice = localStorage.getItem("trustedDevice"); console.log("trustedDevice=", trustedDevice); @@ -252,65 +127,7 @@ const LogInStep = function ({ navigation }) { history.push(path); } } - /* - const UV = function (props) { - const { cognitoUser } = props; - const finishUVRequest = useSelector( - (state) => state.credentials.finishUVRequest - ); - const svpinDispatchProps = { - type: "dispatch", - saveCallback: finishUVResponse, - showSelector: finishUVRequest, - }; - function finishUVResponse(fields) { - const challengeResponse = finishUVRequest; - console.log( - "sending authenticator response with sv-pin: ", - challengeResponse - ); - challengeResponse.pinCode = parseInt(fields.pin); - - Auth.sendCustomChallengeAnswer( - cognitoUser, - JSON.stringify(challengeResponse) - ) - .then((user) => { - console.log("uv sendCustomChallengeAnswer: ", user); - - Auth.currentSession() - .then((data) => { - dispatch(alertActions.success("Authentication successful")); - const userData = { - id: 1, - username: user.attributes.name, - token: data.getAccessToken().getJwtToken(), - }; - localStorage.setItem("user", JSON.stringify(userData)); - console.log("userData ", localStorage.getItem("user")); - history.push("/"); - }) - .catch((err) => { - console.log("currentSession error: ", err); - dispatch( - alertActions.error("Something went wrong. ", err.message) - ); - setContinueSubmitted(false); - }); - }) - .catch((err) => { - console.log("sendCustomChallengeAnswer error: ", err); - const message = "Invalid PIN"; - dispatch(alertActions.error(message)); - setContinueSubmitted(false); - }); - dispatch(credentialActions.completeUV()); - } - - return ; - }; -*/ const promptSvPinStep = () => { navigation.go("PromptSvPinStep"); }; @@ -369,6 +186,7 @@ const LogInStep = function ({ navigation }) { await signIn(inputs.username); history.push("/"); } else if (inputs.forgotStep === true) { + localStorage.setItem("username", inputs.username); forgotStep(); } } else { From 83f3121c25546d6f8cbd86604de98e68b2cad23b Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 13 Dec 2021 13:10:22 -0600 Subject: [PATCH 32/66] Merge main and update metadata --- .../src/main/resources/metadata.json | 454 +++++++++++------- 1 file changed, 286 insertions(+), 168 deletions(-) diff --git a/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/metadata.json b/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/metadata.json index 1716d78..93d0621 100644 --- a/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/metadata.json +++ b/backend/lambda-functions/JavaWebAuthnLib/src/main/resources/metadata.json @@ -1,189 +1,307 @@ { - "identifier": "2fb54029-7613-4f1d-94f1-fb876c14a6fe", - "version": 11, - "vendorInfo": { - "url": "https://yubico.com", - "imageUrl": "https://developers.yubico.com/U2F/Images/yubico.png", - "name": "Yubico" - }, - "trustedCertificates": [ - "-----BEGIN CERTIFICATE-----\nMIIDHjCCAgagAwIBAgIEG1BT9zANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQDEyNZ\ndWJpY28gVTJGIFJvb3QgQ0EgU2VyaWFsIDQ1NzIwMDYzMTAgFw0xNDA4MDEwMDAw\nMDBaGA8yMDUwMDkwNDAwMDAwMFowLjEsMCoGA1UEAxMjWXViaWNvIFUyRiBSb290\nIENBIFNlcmlhbCA0NTcyMDA2MzEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQC/jwYuhBVlqaiYWEMsrWFisgJ+PtM91eSrpI4TK7U53mwCIawSDHy8vUmk\n5N2KAj9abvT9NP5SMS1hQi3usxoYGonXQgfO6ZXyUA9a+KAkqdFnBnlyugSeCOep\n8EdZFfsaRFtMjkwz5Gcz2Py4vIYvCdMHPtwaz0bVuzneueIEz6TnQjE63Rdt2zbw\nnebwTG5ZybeWSwbzy+BJ34ZHcUhPAY89yJQXuE0IzMZFcEBbPNRbWECRKgjq//qT\n9nmDOFVlSRCt2wiqPSzluwn+v+suQEBsUjTGMEd25tKXXTkNW21wIWbxeSyUoTXw\nLvGS6xlwQSgNpk2qXYwf8iXg7VWZAgMBAAGjQjBAMB0GA1UdDgQWBBQgIvz0bNGJ\nhjgpToksyKpP9xv9oDAPBgNVHRMECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAN\nBgkqhkiG9w0BAQsFAAOCAQEAjvjuOMDSa+JXFCLyBKsycXtBVZsJ4Ue3LbaEsPY4\nMYN/hIQ5ZM5p7EjfcnMG4CtYkNsfNHc0AhBLdq45rnT87q/6O3vUEtNMafbhU6kt\nhX7Y+9XFN9NpmYxr+ekVY5xOxi8h9JDIgoMP4VB1uS0aunL1IGqrNooL9mmFnL2k\nLVVee6/VR6C5+KSTCMCWppMuJIZII2v9o4dkoZ8Y7QRjQlLfYzd3qGtKbw7xaF1U\nsG/5xUb/Btwb2X2g4InpiB/yt/3CpQXpiWX/K4mBvUKiGn05ZsqeY1gx4g0xLBqc\nU9psmyPzK+Vsgw2jeRQ5JlKDyqE0hebfC1tvFu0CCrJFcw==\n-----END CERTIFICATE-----" - ], - "devices": [ - { - "deviceId": "1.3.6.1.4.1.41482.1.1", - "displayName": "Security Key NFC by Yubico", - "transports": 12, - "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000019469-security-key-nfc", - "imageUrl": "https://developers.yubico.com/U2F/Images/SKY-NFC.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "key": "1.3.6.1.4.1.45724.1.1.4", - "value": { - "type": "hex", - "value": "6d44ba9bf6ec2e49b9300c8fe920cb73" - } + "identifier": "2fb54029-7613-4f1d-94f1-fb876c14a6fe", + "version": 15, + "vendorInfo": { + "url": "https://yubico.com", + "imageUrl": "https://developers.yubico.com/U2F/Images/yubico.png", + "name": "Yubico" + }, + "trustedCertificates": [ + "-----BEGIN CERTIFICATE-----\nMIIDHjCCAgagAwIBAgIEG1BT9zANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQDEyNZ\ndWJpY28gVTJGIFJvb3QgQ0EgU2VyaWFsIDQ1NzIwMDYzMTAgFw0xNDA4MDEwMDAw\nMDBaGA8yMDUwMDkwNDAwMDAwMFowLjEsMCoGA1UEAxMjWXViaWNvIFUyRiBSb290\nIENBIFNlcmlhbCA0NTcyMDA2MzEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQC/jwYuhBVlqaiYWEMsrWFisgJ+PtM91eSrpI4TK7U53mwCIawSDHy8vUmk\n5N2KAj9abvT9NP5SMS1hQi3usxoYGonXQgfO6ZXyUA9a+KAkqdFnBnlyugSeCOep\n8EdZFfsaRFtMjkwz5Gcz2Py4vIYvCdMHPtwaz0bVuzneueIEz6TnQjE63Rdt2zbw\nnebwTG5ZybeWSwbzy+BJ34ZHcUhPAY89yJQXuE0IzMZFcEBbPNRbWECRKgjq//qT\n9nmDOFVlSRCt2wiqPSzluwn+v+suQEBsUjTGMEd25tKXXTkNW21wIWbxeSyUoTXw\nLvGS6xlwQSgNpk2qXYwf8iXg7VWZAgMBAAGjQjBAMB0GA1UdDgQWBBQgIvz0bNGJ\nhjgpToksyKpP9xv9oDAPBgNVHRMECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAN\nBgkqhkiG9w0BAQsFAAOCAQEAjvjuOMDSa+JXFCLyBKsycXtBVZsJ4Ue3LbaEsPY4\nMYN/hIQ5ZM5p7EjfcnMG4CtYkNsfNHc0AhBLdq45rnT87q/6O3vUEtNMafbhU6kt\nhX7Y+9XFN9NpmYxr+ekVY5xOxi8h9JDIgoMP4VB1uS0aunL1IGqrNooL9mmFnL2k\nLVVee6/VR6C5+KSTCMCWppMuJIZII2v9o4dkoZ8Y7QRjQlLfYzd3qGtKbw7xaF1U\nsG/5xUb/Btwb2X2g4InpiB/yt/3CpQXpiWX/K4mBvUKiGn05ZsqeY1gx4g0xLBqc\nU9psmyPzK+Vsgw2jeRQ5JlKDyqE0hebfC1tvFu0CCrJFcw==\n-----END CERTIFICATE-----" + ], + "devices": [ + { + "deviceId": "1.3.6.1.4.1.41482.1.1", + "displayName": "Security Key NFC by Yubico", + "transports": 12, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000019469-security-key-nfc", + "imageUrl": "https://developers.yubico.com/U2F/Images/SKY-NFC.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "6d44ba9bf6ec2e49b9300c8fe920cb73" } } - ] - }, - - { - "deviceId": "1.3.6.1.4.1.41482.1.1", - "displayName": "Security Key by Yubico", - "transports": 4, - "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006900-security-key-by-yubico", - "imageUrl": "https://developers.yubico.com/U2F/Images/SKY.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "key": "1.3.6.1.4.1.41482.1.1" - } - }, - { - "type": "x509Extension", - "parameters": { - "value": "1.3.6.1.4.1.41482.1.1", - "key": "1.3.6.1.4.1.41482.2" + }, + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "149a20218ef6413396b881f8d5b7f1f5" } } - ] - }, - { - "deviceId": "1.3.6.1.4.1.41482.1.2", - "displayName": "YubiKey NEO/NEO-n", - "transports": 12, - "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006494-yubikey-neo", - "imageUrl": "https://developers.yubico.com/U2F/Images/NEO.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "key": "1.3.6.1.4.1.41482.1.2" + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.1", + "displayName": "Security Key by Yubico", + "transports": 4, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006900-security-key-by-yubico", + "imageUrl": "https://developers.yubico.com/U2F/Images/SKY.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.41482.1.1" + } + }, + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.1", + "key": "1.3.6.1.4.1.41482.2" + } + }, + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "b92c3f9ac0144056887f140a2501163b" } - }, - { - "type": "x509Extension", - "parameters": { - "value": "1.3.6.1.4.1.41482.1.2", - "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.2", + "displayName": "YubiKey NEO/NEO-n", + "transports": 12, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006494-yubikey-neo", + "imageUrl": "https://developers.yubico.com/U2F/Images/NEO.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.41482.1.2" + } + }, + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.2", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.3", + "displayName": "YubiKey Plus", + "transports": 4, + "deviceUrl": "https://www.yubico.com/products/yubikey-hardware/", + "imageUrl": "https://developers.yubico.com/U2F/Images/PLS.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.41482.1.3" + } + }, + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.3", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.4", + "displayName": "YubiKey Edge", + "transports": 4, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006492-yubikey-edge", + "imageUrl": "https://developers.yubico.com/U2F/Images/YKE.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.4", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.5", + "displayName": "YubiKey 4/YubiKey 4 Nano", + "transports": 4, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006486-yubikey-4", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK4.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "value": "1.3.6.1.4.1.41482.1.5", + "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5 NFC", + "transports": 12, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000014174--yubikey-5-nfc", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "fa2b99dc9e3942578f924a30d23c4118" } } - ] - }, - { - "deviceId": "1.3.6.1.4.1.41482.1.3", - "displayName": "YubiKey Plus", - "transports": 4, - "deviceUrl": "https://www.yubico.com/products/yubikey-hardware/", - "imageUrl": "https://developers.yubico.com/U2F/Images/PLS.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "key": "1.3.6.1.4.1.41482.1.3" + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5/5C NFC", + "transports": 12, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000014174--yubikey-5-nfc", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "2fc0579f811347eab116bb5a8db9202a" } - }, - { - "type": "x509Extension", - "parameters": { - "value": "1.3.6.1.4.1.41482.1.3", - "key": "1.3.6.1.4.1.41482.2" + } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5 Series", + "transports": 4, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000014180-yubikey-5c", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5-series.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "cb69481e8ff7403993ec0a2729a154a8" } } - ] - }, - { - "deviceId": "1.3.6.1.4.1.41482.1.4", - "displayName": "YubiKey Edge", - "transports": 4, - "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006492-yubikey-edge", - "imageUrl": "https://developers.yubico.com/U2F/Images/YKE.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "value": "1.3.6.1.4.1.41482.1.4", - "key": "1.3.6.1.4.1.41482.2" + }, + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "ee882879721c491397753dfcce97072a" } } - ] - }, - { - "deviceId": "1.3.6.1.4.1.41482.1.5", - "displayName": "YubiKey 4/YubiKey 4 Nano", - "transports": 4, - "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000006486-yubikey-4", - "imageUrl": "https://developers.yubico.com/U2F/Images/YK4.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "value": "1.3.6.1.4.1.41482.1.5", - "key": "1.3.6.1.4.1.41482.2" + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5Ci", + "transports": 20, + "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000027140-yubikey-5ci", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5Ci.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "c5ef55ffad9a4b9fb580adebafe026d0" } } - ] - }, - { - "deviceId": "1.3.6.1.4.1.41482.1.7", - "displayName": "YubiKey 5 NFC", - "transports": 12, - "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000014174--yubikey-5-nfc", - "imageUrl": "https://developers.yubico.com/U2F/Images/YK5.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "key": "1.3.6.1.4.1.45724.1.1.4", - "value": { - "type": "hex", - "value": "fa2b99dc9e3942578f924a30d23c4118" - } + } + ] + }, + + + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5/5C NFC FIPS", + "transports": 12, + "deviceUrl": "https://support.yubico.com/hc/en-us/articles/360021443340-YubiKey-5-NFC-FIPS", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "c1f9a0bc1dd2404ab27f8e29047a43fd" } } - ] - }, - { - "deviceId": "1.3.6.1.4.1.41482.1.7", - "displayName": "YubiKey 5 Series security key", - "transports": 4, - "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000014180-yubikey-5c", - "imageUrl": "https://developers.yubico.com/U2F/Images/YK5-series.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "key": "1.3.6.1.4.1.45724.1.1.4", - "value": { - "type": "hex", - "value": "cb69481e8ff7403993ec0a2729a154a8" - } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5 FIPS series", + "transports": 4, + "deviceUrl": "https://support.yubico.com/hc/en-us/articles/360021467359-YubiKey-5C-FIPS", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5-series.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "73bb0cd4e50249b89c6fb59445bf720b" } } - ] - }, - { - "deviceId": "1.3.6.1.4.1.41482.1.7", - "displayName": "YubiKey 5Ci", - "transports": 20, - "deviceUrl": "https://support.yubico.com/support/solutions/articles/15000027140-yubikey-5ci", - "imageUrl": "https://developers.yubico.com/U2F/Images/YK5Ci.png", - "selectors": [ - { - "type": "x509Extension", - "parameters": { - "key": "1.3.6.1.4.1.45724.1.1.4", - "value": { - "type": "hex", - "value": "c5ef55ffad9a4b9fb580adebafe026d0" - } + } + ] + }, + + { + "deviceId": "1.3.6.1.4.1.41482.1.7", + "displayName": "YubiKey 5Ci FIPS", + "transports": 20, + "deviceUrl": "https://support.yubico.com/hc/en-us/articles/360021443360-YubiKey-5Ci-FIPS", + "imageUrl": "https://developers.yubico.com/U2F/Images/YK5Ci.png", + "selectors": [ + { + "type": "x509Extension", + "parameters": { + "key": "1.3.6.1.4.1.45724.1.1.4", + "value": { + "type": "hex", + "value": "8520342148f943559bc88a53846e5083" } } - ] - } - ] - } \ No newline at end of file + } + ] + } + ] +} \ No newline at end of file From 76e7a4f439fa90f2b1cbfca1668401e6b4dbc9ad Mon Sep 17 00:00:00 2001 From: csalas Date: Mon, 13 Dec 2021 14:16:36 -0600 Subject: [PATCH 33/66] Added attestation displays --- .../src/_components/Credential/Credential.jsx | 25 ++++++++++- .../_components/Credential/EditCredential.jsx | 41 +++++++++++++++++++ .../src/_components/component.module.css | 5 ++- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/clients/web/react/src/_components/Credential/Credential.jsx b/clients/web/react/src/_components/Credential/Credential.jsx index 3c910bd..c4daae0 100644 --- a/clients/web/react/src/_components/Credential/Credential.jsx +++ b/clients/web/react/src/_components/Credential/Credential.jsx @@ -4,6 +4,21 @@ import styles from "../component.module.css"; import { EditCredential } from "./EditCredential"; +const checkAttestation = (credential) => { + const credAtt = + credential.attestationMetadata?.value?.deviceProperties?.displayName; + if (credAtt) return true; + return false; +}; + +const getAttestationImage = (credential) => { + const imgUrl = + credential.attestationMetadata?.value?.deviceProperties?.imageUrl; + console.log(imgUrl); + if (imgUrl) return imgUrl; + return "https://www.yubico.com/wp-content/uploads//2021/02/illus-shield-lock-r1-dkteal.svg"; +}; + const Credential = function ({ credential }) { return ( <> @@ -11,12 +26,20 @@ const Credential = function ({ credential }) {
{credential.credentialNickname.value}
+ {checkAttestation(credential) && ( +
+ { + credential.attestationMetadata.value.deviceProperties + .displayName + } +
+ )}

Date Last used:{" "} {new Date(credential.lastUsedTime.seconds * 1000).toLocaleString()} diff --git a/clients/web/react/src/_components/Credential/EditCredential.jsx b/clients/web/react/src/_components/Credential/EditCredential.jsx index c6f9b6d..a5255a1 100644 --- a/clients/web/react/src/_components/Credential/EditCredential.jsx +++ b/clients/web/react/src/_components/Credential/EditCredential.jsx @@ -51,6 +51,13 @@ const EditCredential = function ({ credential }) { }; const inputRef = useRef(null); + const checkAttestation = (credential) => { + const credAtt = + credential.attestationMetadata?.value?.deviceProperties?.displayName; + if (credAtt) return true; + return false; + }; + return ( <> )} diff --git a/clients/web/react/src/_components/ServerVerifiedPin/index.js b/clients/web/react/src/_components/ServerVerifiedPin/index.js deleted file mode 100644 index 2c45b9a..0000000 --- a/clients/web/react/src/_components/ServerVerifiedPin/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import ServerVerifiedPin from "./ServerVerifiedPin"; - -export default ServerVerifiedPin; diff --git a/clients/web/react/src/tsconfig.json b/clients/web/react/src/tsconfig.json index dbb6956..980dd05 100644 --- a/clients/web/react/src/tsconfig.json +++ b/clients/web/react/src/tsconfig.json @@ -7,6 +7,7 @@ "allowJs": true, "allowSyntheticDefaultImports": true, "moduleResolution": "node", - "module": "AMD" + "module": "AMD", + "esModuleInterop": true } } From 1710acbc34dfb6fac15e661fe223758b1ebf9147 Mon Sep 17 00:00:00 2001 From: csalas Date: Thu, 16 Dec 2021 13:52:07 -0600 Subject: [PATCH 37/66] Continue TS migration. Migrated Home, App, Logout Step, and Login Step --- .../web/react/src/App/{App.jsx => App.tsx} | 31 ++--- .../HomePage/{HomePage.jsx => HomePage.tsx} | 22 ++-- clients/web/react/src/HomePage/index.js | 3 - .../IdentifierFirstFlowProto.jsx | 20 --- .../src/IdentifierFirstFlowProto/index.js | 1 - .../{ForgotStep.js => ForgotStep.tsx} | 75 ++++++----- .../LoginPage/IdentifierFirstLoginFlow.jsx | 54 -------- .../LoginPage/IdentifierFirstLoginFlow.tsx | 47 +++++++ .../IdentifierFirstLoginFlowPage.jsx | 14 --- .../IdentifierFirstLoginFlowPage.tsx | 13 ++ .../LoginPage/{LogInStep.js => LogInStep.tsx} | 36 +++--- .../src/LoginPage/LogInTrustedDeviceStep.js | 2 +- clients/web/react/src/LoginPage/LoginPage.jsx | 90 ------------- .../react/src/LoginPage/PromptSvPinStep.js | 119 ------------------ .../LoginPage/RegisterTrustedDeviceStep.js | 2 +- clients/web/react/src/LoginPage/index.js | 3 - .../{LogoutPage.jsx => LogoutPage.tsx} | 6 +- clients/web/react/src/LogoutPage/index.js | 3 - .../src/_components/component.module.css | 4 + clients/web/react/{src => }/tsconfig.json | 0 20 files changed, 146 insertions(+), 399 deletions(-) rename clients/web/react/src/App/{App.jsx => App.tsx} (63%) rename clients/web/react/src/HomePage/{HomePage.jsx => HomePage.tsx} (91%) delete mode 100644 clients/web/react/src/HomePage/index.js delete mode 100755 clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx delete mode 100644 clients/web/react/src/IdentifierFirstFlowProto/index.js rename clients/web/react/src/LoginPage/{ForgotStep.js => ForgotStep.tsx} (58%) delete mode 100644 clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.jsx create mode 100644 clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.tsx delete mode 100755 clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.jsx create mode 100755 clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.tsx rename clients/web/react/src/LoginPage/{LogInStep.js => LogInStep.tsx} (91%) delete mode 100755 clients/web/react/src/LoginPage/LoginPage.jsx delete mode 100644 clients/web/react/src/LoginPage/PromptSvPinStep.js delete mode 100644 clients/web/react/src/LoginPage/index.js rename clients/web/react/src/LogoutPage/{LogoutPage.jsx => LogoutPage.tsx} (86%) delete mode 100644 clients/web/react/src/LogoutPage/index.js rename clients/web/react/{src => }/tsconfig.json (100%) diff --git a/clients/web/react/src/App/App.jsx b/clients/web/react/src/App/App.tsx similarity index 63% rename from clients/web/react/src/App/App.jsx rename to clients/web/react/src/App/App.tsx index b51b038..620ca7c 100644 --- a/clients/web/react/src/App/App.jsx +++ b/clients/web/react/src/App/App.tsx @@ -1,35 +1,22 @@ -import React, { useEffect } from "react"; +import React from "react"; import { Router, Route, Switch, Redirect } from "react-router-dom"; -import { useDispatch, useSelector } from "react-redux"; +import { useSelector, RootStateOrAny } from "react-redux"; import { Jumbotron, Container, Row, Col, Card } from "react-bootstrap"; import Amplify from "aws-amplify"; import { history } from "../_helpers"; -import { alertActions } from "../_actions"; import { PrivateRoute } from "../_components"; -import HomePage from "../HomePage"; -import { IdentifierFirstLoginFlowPage } from "../LoginPage"; -import { LoginWithSecurityKeyPage } from "../LoginWithSecurityKeyPage"; -import { RegisterPage, IdentifierFirstSignUpFlowPage } from "../RegisterPage"; -import { IdentifierFirstFlowProto } from "../IdentifierFirstFlowProto"; -import LogoutPage from "../LogoutPage"; +import HomePage from "../HomePage/HomePage"; +import IdentifierFirstLoginFlowPage from "../LoginPage/IdentifierFirstLoginFlowPage"; +import { IdentifierFirstSignUpFlowPage } from "../RegisterPage"; +import LogoutPage from "../LogoutPage/LogoutPage"; import aws_exports from "../aws-exports"; const config = Amplify.configure(aws_exports); const App = function () { - const alert = useSelector((state) => state.alert); - const dispatch = useDispatch(); - - // console.log(JSON.stringify(config)); - - useEffect(() => { - history.listen((location, action) => { - // clear alert on location change - dispatch(alertActions.clear()); - }); - }, []); + const alert = useSelector((state: RootStateOrAny) => state.alert); return ( @@ -57,10 +44,6 @@ const App = function () { path="/register" component={IdentifierFirstSignUpFlowPage} /> - diff --git a/clients/web/react/src/HomePage/HomePage.jsx b/clients/web/react/src/HomePage/HomePage.tsx similarity index 91% rename from clients/web/react/src/HomePage/HomePage.jsx rename to clients/web/react/src/HomePage/HomePage.tsx index d7a4cbb..9b1ed38 100644 --- a/clients/web/react/src/HomePage/HomePage.jsx +++ b/clients/web/react/src/HomePage/HomePage.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from "react"; -import { useDispatch, useSelector } from "react-redux"; +import { useDispatch, useSelector, RootStateOrAny } from "react-redux"; import { Button, Card, Spinner, Table } from "react-bootstrap"; import { Auth } from "aws-amplify"; import { credentialActions } from "../_actions"; @@ -8,12 +8,13 @@ import CredentialList from "../_components/Credential/CredentialList"; import RecoveryCodes from "../_components/RecoveryCodes/RecoveryCodes"; import DeleteUser from "../_components/DeleteUser/DeleteUser"; import ServerVerifiedPin from "../_components/ServerVerifiedPin/ServerVerifiedPin"; -import styles from "../_components/component.module.css"; + +const styles = require("../_components/component.module.css"); const HomePage = function () { const [jwt, setjwt] = useState(""); - const credentials = useSelector((state) => state.credentials); - const alert = useSelector((state) => state.alert); + const credentials = useSelector((state: RootStateOrAny) => state.credentials); + const alert = useSelector((state: RootStateOrAny) => state.alert); const [credentialItems, setCredentialItems] = useState([]); const [recoveryCodeProps, setRecoveryCodeProps] = useState({ allRecoveryCodesUsed: false, @@ -38,7 +39,6 @@ const HomePage = function () { }; async function currentAuthenticatedUser() { - // dispatch(userActions.getCurrentAuthenticatedUser()); const data = await Auth.currentSession(); const token = data.getIdToken().getJwtToken(); if (token) { @@ -99,7 +99,7 @@ const HomePage = function () { <>

Account Security

- +
Trusted Devices
@@ -156,14 +156,14 @@ const HomePage = function () {
{credentialsLoading ? ( -
+

Getting your security keys!

-
+
) : ( )} - +
Server Verified PIN
@@ -172,10 +172,10 @@ const HomePage = function () {
{credentialsLoading ? ( -
+

Getting your recovery codes!

-
+
) : ( )} diff --git a/clients/web/react/src/HomePage/index.js b/clients/web/react/src/HomePage/index.js deleted file mode 100644 index 13792be..0000000 --- a/clients/web/react/src/HomePage/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import HomePage from "./HomePage"; - -export default HomePage; diff --git a/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx b/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx deleted file mode 100755 index 13a15f1..0000000 --- a/clients/web/react/src/IdentifierFirstFlowProto/IdentifierFirstFlowProto.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { Button, Row, Col } from 'react-bootstrap'; - -import { userActions } from '../_actions'; -import { history } from '../_helpers'; -import validate from 'validate.js'; - -import { IdentifierFirstFlow } from '../_components'; - -function IdentifierFirstFlowProto() { - - return ( - <> - - - ); -} - -export { IdentifierFirstFlowProto }; \ No newline at end of file diff --git a/clients/web/react/src/IdentifierFirstFlowProto/index.js b/clients/web/react/src/IdentifierFirstFlowProto/index.js deleted file mode 100644 index 0362eb4..0000000 --- a/clients/web/react/src/IdentifierFirstFlowProto/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './IdentifierFirstFlowProto'; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/ForgotStep.js b/clients/web/react/src/LoginPage/ForgotStep.tsx similarity index 58% rename from clients/web/react/src/LoginPage/ForgotStep.js rename to clients/web/react/src/LoginPage/ForgotStep.tsx index a3d805e..035d1ac 100644 --- a/clients/web/react/src/LoginPage/ForgotStep.js +++ b/clients/web/react/src/LoginPage/ForgotStep.tsx @@ -1,33 +1,33 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; +import React, { useState } from "react"; +import { useDispatch } from "react-redux"; +import { Button, InputGroup, FormControl, Form } from "react-bootstrap"; -import { Auth } from 'aws-amplify'; +import { Auth } from "aws-amplify"; -import { alertActions } from '../_actions'; -import { history } from '../_helpers'; +import { alertActions } from "../_actions"; +import { history } from "../_helpers"; +const styles = require("../_components/component.module.css"); -const ForgotStep = ({ setForm, formData, navigation }) => { +const ForgotStep = ({ navigation }) => { const [validated, setValidated] = useState(false); const dispatch = useDispatch(); const [inputs, setInputs] = useState({ - username: localStorage.getItem('username'), - recoveryCode: undefined + username: localStorage.getItem("username"), + recoveryCode: undefined, }); const LogInStep = () => { - // TODO: Clear Alerts - navigation.go('LogInStep'); - } + navigation.go("LogInStep"); + }; const handleChange = (e) => { const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); + setInputs((inputs) => ({ ...inputs, [name]: value })); setValidated(false); - } + }; const handleSubmit = (event) => { const form = event.currentTarget; @@ -43,40 +43,43 @@ const ForgotStep = ({ setForm, formData, navigation }) => { if (inputs.recoveryCode) { handleRecoveryCode(inputs.recoveryCode); } - } + }; async function handleRecoveryCode(code) { try { let cognitoUser = await Auth.signIn(inputs.username); console.log("CognitoUser: ", cognitoUser); - Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify({ recoveryCode: code })) - .then(user => { + Auth.sendCustomChallengeAnswer( + cognitoUser, + JSON.stringify({ recoveryCode: code }) + ) + .then((user) => { console.log(user); Auth.currentSession() - .then(data => { - dispatch(alertActions.success('Authentication successful')); + .then((data) => { + dispatch(alertActions.success("Authentication successful")); let userData = { id: 1, username: user.attributes.name, - token: data.getAccessToken().getJwtToken() - } - localStorage.setItem('user', JSON.stringify(userData)); - console.log("userData ", localStorage.getItem('user')); - history.push('/'); + token: data.getAccessToken().getJwtToken(), + }; + localStorage.setItem("user", JSON.stringify(userData)); + console.log("userData ", localStorage.getItem("user")); + history.push("/"); }) - .catch(err => { + .catch((err) => { console.log("currentSession error: ", err); - dispatch(alertActions.error("Something went wrong. ", err.message)); + const errorAlert = "Something went wrong. " + err.message; + dispatch(alertActions.error(errorAlert)); }); }) - .catch(err => { + .catch((err) => { console.log("sendCustomChallengeAnswer error: ", err); let msg = "Invalid recovery code"; dispatch(alertActions.error(msg)); }); - } catch (error) { console.error("recovery code error"); console.error(error); @@ -86,10 +89,10 @@ const ForgotStep = ({ setForm, formData, navigation }) => { return ( <> -
+

Forgot Your Security Key?

-
+
@@ -108,16 +111,22 @@ const ForgotStep = ({ setForm, formData, navigation }) => { Please provide a recover code. - +

-
Back to Log In
+
+ + Back to Log In + +
); }; -export default ForgotStep; \ No newline at end of file +export default ForgotStep; diff --git a/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.jsx b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.jsx deleted file mode 100644 index 8813fc1..0000000 --- a/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from "react"; -import { useStep } from "react-hooks-helper"; - -import LogInStep from "./LogInStep"; -import ForgotStep from "./ForgotStep"; -import PromptSvPinStep from "./PromptSvPinStep"; -import RegisterTrustedDeviceStep from "./RegisterTrustedDeviceStep"; -import LogInTrustedDeviceStep from "./LogInTrustedDeviceStep"; -import RegisterDeviceSuccessStep from "./RegisterDeviceSuccessStep"; - -const steps = [ - { id: "LogInTrustedDeviceStep" }, - { id: "LogInStep" }, - { id: "ForgotStep" }, - { id: "PromptSvPinStep" }, - { id: "RegisterTrustedDeviceStep" }, - { id: "RegisterDeviceSuccessStep" } -]; - -export const IdentifierFirstLoginFlow = ({ images }) => { - let trustedDevice = localStorage.getItem('trustedDevice'); - const _initialStep = trustedDevice === "true" ? 0 : 1; - const { step, navigation } = useStep({ initialStep: _initialStep, steps }); - - const { id } = step; - - const props = { navigation }; - - const renderSwitch = (id) => { - switch (id) { - case "LogInTrustedDeviceStep": - return ; - case "LogInStep": - return ; - case "ForgotStep": - return ; - case "PromptSvPinStep": - return ; - case "RegisterTrustedDeviceStep": - return ; - case "RegisterDeviceSuccessStep": - return ; - default: - return null; - } - }; - - return ( - <> - {renderSwitch(id)} - - ); - -} \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.tsx b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.tsx new file mode 100644 index 0000000..81804d3 --- /dev/null +++ b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlow.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import { useStep } from "react-hooks-helper"; + +import LogInStep from "./LogInStep"; +import ForgotStep from "./ForgotStep"; +import RegisterTrustedDeviceStep from "./RegisterTrustedDeviceStep"; +import LogInTrustedDeviceStep from "./LogInTrustedDeviceStep"; +import RegisterDeviceSuccessStep from "./RegisterDeviceSuccessStep"; + +const steps = [ + { id: "LogInTrustedDeviceStep" }, + { id: "LogInStep" }, + { id: "ForgotStep" }, + { id: "RegisterTrustedDeviceStep" }, + { id: "RegisterDeviceSuccessStep" }, +]; + +const IdentifierFirstLoginFlow = () => { + let trustedDevice = localStorage.getItem("trustedDevice"); + const _initialStep = trustedDevice === "true" ? 0 : 1; + const { step, navigation } = useStep({ initialStep: _initialStep, steps }); + + const { id } = step; + + const props = { navigation }; + + const renderSwitch = (id) => { + switch (id) { + case "LogInTrustedDeviceStep": + return ; + case "LogInStep": + return ; + case "ForgotStep": + return ; + case "RegisterTrustedDeviceStep": + return ; + //case "RegisterDeviceSuccessStep": + //return ; + default: + return null; + } + }; + + return <>{renderSwitch(id)}; +}; + +export default IdentifierFirstLoginFlow; diff --git a/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.jsx b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.jsx deleted file mode 100755 index 6283520..0000000 --- a/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -import { IdentifierFirstLoginFlow } from '.'; - -function IdentifierFirstLoginFlowPage() { - - return ( - <> - - - ); -} - -export { IdentifierFirstLoginFlowPage }; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.tsx b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.tsx new file mode 100755 index 0000000..cda6eaa --- /dev/null +++ b/clients/web/react/src/LoginPage/IdentifierFirstLoginFlowPage.tsx @@ -0,0 +1,13 @@ +import React from "react"; + +import IdentifierFirstLoginFlow from "./IdentifierFirstLoginFlow"; + +function IdentifierFirstLoginFlowPage() { + return ( + <> + + + ); +} + +export default IdentifierFirstLoginFlowPage; diff --git a/clients/web/react/src/LoginPage/LogInStep.js b/clients/web/react/src/LoginPage/LogInStep.tsx similarity index 91% rename from clients/web/react/src/LoginPage/LogInStep.js rename to clients/web/react/src/LoginPage/LogInStep.tsx index 7d6f25b..23bb562 100644 --- a/clients/web/react/src/LoginPage/LogInStep.js +++ b/clients/web/react/src/LoginPage/LogInStep.tsx @@ -1,6 +1,6 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, ReactElement } from "react"; import { Button, InputGroup, Form, Spinner } from "react-bootstrap"; -import { useDispatch, useSelector } from "react-redux"; +import { useDispatch, useSelector, RootStateOrAny } from "react-redux"; import base64url from "base64url"; import validate from "validate.js"; @@ -9,7 +9,7 @@ import ServerVerifiedPin from "../_components/ServerVerifiedPin/ServerVerifiedPi import { history } from "../_helpers"; import { credentialActions, alertActions } from "../_actions"; -import styles from "../_components/component.module.css"; +const styles = require("../_components/component.module.css"); const LogInStep = function ({ navigation }) { const [inputs, setInputs] = useState({ @@ -22,10 +22,10 @@ const LogInStep = function ({ navigation }) { }); const [validated, setValidated] = useState(false); const webAuthnStartResponse = useSelector( - (state) => state.authentication.webAuthnStartResponse + (state: RootStateOrAny) => state.authentication.webAuthnStartResponse ); const [continueSubmitted, setContinueSubmitted] = useState(false); - const [serverVerifiedPin, setServerVerifiedPin] = useState(); + const [serverVerifiedPin, setServerVerifiedPin] = useState(); const constraints = { username: { @@ -44,11 +44,13 @@ const LogInStep = function ({ navigation }) { const dispatch = useDispatch(); + /* useEffect(() => { if (webAuthnStartResponse) { signInWithoutUsername(); } }, [webAuthnStartResponse]); + */ function getUV(authenticatorData) { const buffer = base64url.toBuffer(authenticatorData); @@ -65,7 +67,7 @@ const LogInStep = function ({ navigation }) { return flags.uv; } - const UVPromise = () => { + const UVPromise = (): Promise<{ value: number }> => { return new Promise((resolve, reject) => { const svpinCreateProps = { type: "dispatch", @@ -128,9 +130,6 @@ const LogInStep = function ({ navigation }) { } } - const promptSvPinStep = () => { - navigation.go("PromptSvPinStep"); - }; const registerTrustedDeviceStep = () => { navigation.go("RegisterTrustedDeviceStep"); }; @@ -203,13 +202,13 @@ const LogInStep = function ({ navigation }) { return ( <> -
+

Welcome

-
+
- + @ @@ -236,8 +235,7 @@ const LogInStep = function ({ navigation }) { value="continue" variant="primary" block - disabled={continueSubmitted} - > + disabled={continueSubmitted}> {continueSubmitted && ( + className="float-right"> Forgot Your Security Key?
@@ -265,8 +262,7 @@ const LogInStep = function ({ navigation }) {
@@ -274,12 +270,12 @@ const LogInStep = function ({ navigation }) {
-
+
Don't have an account?{" "} Sign Up -
+
{serverVerifiedPin} diff --git a/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.js b/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.js index d2cae35..ac041a1 100644 --- a/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.js +++ b/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.js @@ -9,7 +9,7 @@ import { userActions, alertActions } from '../_actions'; import { history } from '../_helpers'; -const LogInTrustedDeviceStep = ({ setForm, formData, navigation }) => { +const LogInTrustedDeviceStep = ({ navigation }) => { const webAuthnStartResponse = useSelector(state => state.authentication.webAuthnStartResponse); const defaultInvalidPIN = -1; diff --git a/clients/web/react/src/LoginPage/LoginPage.jsx b/clients/web/react/src/LoginPage/LoginPage.jsx deleted file mode 100755 index ee53990..0000000 --- a/clients/web/react/src/LoginPage/LoginPage.jsx +++ /dev/null @@ -1,90 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { Button, Row, Col } from 'react-bootstrap'; - -import { userActions } from '../_actions'; -import { history } from '../_helpers'; -import validate from 'validate.js'; - -function LoginPage() { - const [inputs, setInputs] = useState({ - username: '' - }); - const [submitted, setSubmitted] = useState(false); - const [invalidUsername, setInvalidUsername] = useState(undefined); - const { username } = inputs; - const loggingIn = useSelector(state => state.authentication.loggingIn); - const dispatch = useDispatch(); - var constraints = { - username: { - presence: true, - format: { - pattern: "[a-z0-9_\-]+", - flags: "i", - message: "can only contain a-z, 0-9, or _-" - }, - length: { - minimum: 3, - maximum: 20 - } - } - }; - - // reset login status - useEffect(() => { - dispatch(userActions.logout()); - }, []); - - function handleChange(e) { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - } - - function handleSubmit(e) { - e.preventDefault(); - - setSubmitted(true); - - const result = validate({username: username}, constraints) - if(result){ - console.error("invalid username: ", result); - setInvalidUsername(result.username.join(". ")); - return; - } else { - setInvalidUsername(undefined); - } - - dispatch(userActions.exists(username.toLocaleLowerCase())); - - } - - function handleLoginWithoutUsername() { - localStorage.removeItem('username'); - history.push('/loginWithSecurityKey'); - } - - return ( - <> -

WebAuthn Starter Kit

- - -
- - - {submitted && invalidUsername && -
{invalidUsername}
- } -
-
- -
- - - - ); -} - -export { LoginPage }; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/PromptSvPinStep.js b/clients/web/react/src/LoginPage/PromptSvPinStep.js deleted file mode 100644 index a1132b7..0000000 --- a/clients/web/react/src/LoginPage/PromptSvPinStep.js +++ /dev/null @@ -1,119 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; -import validate from 'validate.js'; - -import styles from "../_components/component.module.css"; - -const PromptSvPinStep = ({ setForm, formData, navigation }) => { - const [validated, setValidated] = useState(false); - - var constraints = { - pin: { - presence: true, - numericality: { - onlyInteger: true, - greaterThan: -1, - }, - length: { - minimum: 4, - maximum: 16 - } - } - }; - - const [inputs, setInputs] = useState({ - username: localStorage.getItem('username'), - pin: '' - }); - - const [errors, setErrors] = useState({ - pin: '' - }); - - const LogInStep = () => { - navigation.go('LogInStep'); - } - const registerTrustedDeviceStep = () => { - navigation.go('RegisterTrustedDeviceStep'); - } - - const handleChange = (e) => { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - - setValidated(false); - - const result = validate(inputs, constraints); - if (result) { - if (result[name]) { - setErrors(errors => ({ ...errors, [name]: result[name].join(". ") })); - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } - - const handleSubmit = (event) => { - const form = event.currentTarget; - - event.preventDefault(); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - setValidated(true); - - if (isInputValid()) { - registerTrustedDeviceStep(); - } - } - - const isInputValid = () => { - if (validate(inputs, constraints)) { - return false; - } - return true; - } - - return ( - <> -
-

Welcome

- -
-
- - - Server Verified PIN - - - - {errors.pin} - - - -
-
-
-
-
-
Try Another Method
-
- - ); -}; - -export default PromptSvPinStep; \ No newline at end of file diff --git a/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js b/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js index aaac8ae..77704db 100644 --- a/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js +++ b/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.js @@ -6,7 +6,7 @@ import { history } from '../_helpers'; import { WebAuthnClient } from '../_components'; import { userActions, credentialActions, alertActions } from '../_actions'; -const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { +const RegisterTrustedDeviceStep = ({ navigation }) => { const dispatch = useDispatch(); diff --git a/clients/web/react/src/LoginPage/index.js b/clients/web/react/src/LoginPage/index.js deleted file mode 100644 index 448a6a3..0000000 --- a/clients/web/react/src/LoginPage/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export * from './LoginPage'; -export * from './IdentifierFirstLoginFlowPage'; -export * from './IdentifierFirstLoginFlow'; \ No newline at end of file diff --git a/clients/web/react/src/LogoutPage/LogoutPage.jsx b/clients/web/react/src/LogoutPage/LogoutPage.tsx similarity index 86% rename from clients/web/react/src/LogoutPage/LogoutPage.jsx rename to clients/web/react/src/LogoutPage/LogoutPage.tsx index 5862712..b43bf9a 100644 --- a/clients/web/react/src/LogoutPage/LogoutPage.jsx +++ b/clients/web/react/src/LogoutPage/LogoutPage.tsx @@ -3,6 +3,8 @@ import { Spinner } from "react-bootstrap"; import { Auth } from "aws-amplify"; import { history } from "../_helpers"; +const styles = require("../_components/component.module.css"); + const LogoutPage = function () { const logoutUser = async () => { console.log("Called into loader"); @@ -23,10 +25,10 @@ const LogoutPage = function () { }, []); return ( -
+

Thank you for joining us!

-
+
); }; diff --git a/clients/web/react/src/LogoutPage/index.js b/clients/web/react/src/LogoutPage/index.js deleted file mode 100644 index fb0c1b4..0000000 --- a/clients/web/react/src/LogoutPage/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import LogoutPage from "./LogoutPage"; - -export default LogoutPage; diff --git a/clients/web/react/src/_components/component.module.css b/clients/web/react/src/_components/component.module.css index a154f8f..79c432d 100644 --- a/clients/web/react/src/_components/component.module.css +++ b/clients/web/react/src/_components/component.module.css @@ -45,4 +45,8 @@ .cardSpacing { margin-bottom: 1em; +} + +.textCenter { + text-align: center; } \ No newline at end of file diff --git a/clients/web/react/src/tsconfig.json b/clients/web/react/tsconfig.json similarity index 100% rename from clients/web/react/src/tsconfig.json rename to clients/web/react/tsconfig.json From 0278663d09808652499590c076a7d2c2cc514899 Mon Sep 17 00:00:00 2001 From: csalas Date: Thu, 16 Dec 2021 14:16:39 -0600 Subject: [PATCH 38/66] Added TS for Register Flow --- clients/web/react/src/App/App.tsx | 2 +- .../IdentifierFirstSignUpFlow.jsx | 47 --- .../IdentifierFirstSignUpFlow.tsx | 40 +++ .../IdentifierFirstSignUpFlowPage.jsx | 14 - .../IdentifierFirstSignUpFlowPage.tsx | 13 + .../RegisterPage/RegisterKeySuccessStep.js | 98 ------ .../RegisterPage/RegisterKeySuccessStep.tsx | 112 +++++++ .../react/src/RegisterPage/RegisterPage.jsx | 306 ------------------ .../src/RegisterPage/RegisterSvPinStep.js | 134 -------- .../web/react/src/RegisterPage/SignUpStep.js | 179 ---------- .../web/react/src/RegisterPage/SignUpStep.tsx | 190 +++++++++++ clients/web/react/src/RegisterPage/index.js | 3 - 12 files changed, 356 insertions(+), 782 deletions(-) delete mode 100644 clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.jsx create mode 100644 clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.tsx delete mode 100755 clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.jsx create mode 100755 clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.tsx delete mode 100644 clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js create mode 100644 clients/web/react/src/RegisterPage/RegisterKeySuccessStep.tsx delete mode 100644 clients/web/react/src/RegisterPage/RegisterPage.jsx delete mode 100644 clients/web/react/src/RegisterPage/RegisterSvPinStep.js delete mode 100644 clients/web/react/src/RegisterPage/SignUpStep.js create mode 100644 clients/web/react/src/RegisterPage/SignUpStep.tsx delete mode 100644 clients/web/react/src/RegisterPage/index.js diff --git a/clients/web/react/src/App/App.tsx b/clients/web/react/src/App/App.tsx index 620ca7c..f64ef0c 100644 --- a/clients/web/react/src/App/App.tsx +++ b/clients/web/react/src/App/App.tsx @@ -8,7 +8,7 @@ import { history } from "../_helpers"; import { PrivateRoute } from "../_components"; import HomePage from "../HomePage/HomePage"; import IdentifierFirstLoginFlowPage from "../LoginPage/IdentifierFirstLoginFlowPage"; -import { IdentifierFirstSignUpFlowPage } from "../RegisterPage"; +import IdentifierFirstSignUpFlowPage from "../RegisterPage/IdentifierFirstSignUpFlowPage"; import LogoutPage from "../LogoutPage/LogoutPage"; import aws_exports from "../aws-exports"; diff --git a/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.jsx b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.jsx deleted file mode 100644 index 3ed28fe..0000000 --- a/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from "react"; -import { useForm, useStep } from "react-hooks-helper"; - -import SignUpStep from "./SignUpStep"; -import RegisterSvPinStep from "./RegisterSvPinStep"; -import RegisterKeySuccessStep from "./RegisterKeySuccessStep"; - -const steps = [ - { id: "SignUpStep" }, - { id: "RegisterSvPinStep" }, - { id: "RegisterKeySuccessStep" } -]; - -const defaultData = { - username: localStorage.getItem('username'), - pin: -1, - nickname: "Security Key", - credential: localStorage.getItem('credential') - }; - -export const IdentifierFirstSignUpFlow = ({ images }) => { - const [formData, setForm] = useForm(defaultData); - const _initialStep = defaultData.credential == null ? 0 : 2; - const { step, navigation } = useStep({ initialStep: _initialStep, steps }); - const { id } = step; - const props = { formData, setForm, navigation }; - - const renderSwitch = (id) => { - switch (id) { - case "SignUpStep": - return ; - case "RegisterSvPinStep": - return ; - case "RegisterKeySuccessStep": - return ; - default: - return null; - } - }; - - return ( - <> - {renderSwitch(id)} - - ); - -} \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.tsx b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.tsx new file mode 100644 index 0000000..464d09b --- /dev/null +++ b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlow.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import { useForm, useStep } from "react-hooks-helper"; +import SignUpStep from "./SignUpStep"; +import RegisterKeySuccessStep from "./RegisterKeySuccessStep"; + +const steps = [ + { id: "SignUpStep" }, + { id: "RegisterSvPinStep" }, + { id: "RegisterKeySuccessStep" }, +]; + +const defaultData = { + username: localStorage.getItem("username"), + pin: -1, + nickname: "Security Key", + credential: localStorage.getItem("credential"), +}; + +const IdentifierFirstSignUpFlow = () => { + const [formData, setForm] = useForm(defaultData); + const _initialStep = defaultData.credential == null ? 0 : 2; + const { step, navigation } = useStep({ initialStep: _initialStep, steps }); + const { id } = step; + const props = { formData, setForm, navigation }; + + const renderSwitch = (id) => { + switch (id) { + case "SignUpStep": + return ; + case "RegisterKeySuccessStep": + return ; + default: + return null; + } + }; + + return <>{renderSwitch(id)}; +}; + +export default IdentifierFirstSignUpFlow; diff --git a/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.jsx b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.jsx deleted file mode 100755 index 0084e21..0000000 --- a/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -import { IdentifierFirstSignUpFlow } from '.'; - -function IdentifierFirstSignUpFlowPage() { - - return ( - <> - - - ); -} - -export { IdentifierFirstSignUpFlowPage }; \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.tsx b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.tsx new file mode 100755 index 0000000..8cfff42 --- /dev/null +++ b/clients/web/react/src/RegisterPage/IdentifierFirstSignUpFlowPage.tsx @@ -0,0 +1,13 @@ +import React from "react"; + +import IdentifierFirstSignUpFlow from "./IdentifierFirstSignUpFlow"; + +function IdentifierFirstSignUpFlowPage() { + return ( + <> + + + ); +} + +export default IdentifierFirstSignUpFlowPage; diff --git a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js deleted file mode 100644 index 9f5fc4c..0000000 --- a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.js +++ /dev/null @@ -1,98 +0,0 @@ -import React, { useState, useEffect, useRef, Profiler } from 'react'; -import { Button, InputGroup, FormControl, } from 'react-bootstrap'; -import { useDispatch, useSelector } from 'react-redux'; - -import { history } from '../_helpers'; -import { userActions, credentialActions, alertActions } from '../_actions'; - - -const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { - - const dispatch = useDispatch(); - - const validNickname = useSelector(state => state.credentials.validNickname); - const updateComplete = useSelector(state => state.credentials.updateComplete); - - useEffect(() => { - dispatch(userActions.getCurrentAuthenticatedUser()); // Get the jwt token after signup - }, []); - - useEffect(() => { - if (validNickname){ - updateCredential(validNickname); - } - },[validNickname]); - - useEffect(() => { - if (updateComplete) { - history.push('/'); - } - },[updateComplete]); - - const { username, pin, nickname, credential } = formData; - - async function updateCredential(nickname){ - console.log("RegisterKeySuccessStep updateCredential() nickname:", nickname); - try { - let ls_credential = JSON.parse(localStorage.getItem('credential')); - console.log("RegisterKeySuccessStep updateCredential() ls_credential:", ls_credential); - - let credentialToUpdate = { - credential: { - credentialId: { - base64: ls_credential.id - } - }, - credentialNickname: { - value: nickname - } - } - - dispatch(credentialActions.update(credentialToUpdate)); - - } catch (err) { - - console.error("RegisterKeySuccessStep continueStep() error"); - console.error(err); - dispatch(alertActions.error(err.message)); - - } - localStorage.removeItem('credential'); - - } - - function continueStep() { - dispatch(credentialActions.validateCredentialNickname(nickname)); - } - - return ( - <> -
-

Security Key Added

- -
-
-
- - - - - - - -
-
- -
-
- - ); -}; - -export default RegisterKeySuccessStep; \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.tsx b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.tsx new file mode 100644 index 0000000..d42b821 --- /dev/null +++ b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.tsx @@ -0,0 +1,112 @@ +import React, { useState, useEffect } from "react"; +import { Button, InputGroup, FormControl } from "react-bootstrap"; +import { useDispatch, useSelector, RootStateOrAny } from "react-redux"; +import { history } from "../_helpers"; +import { userActions, credentialActions, alertActions } from "../_actions"; + +const styles = require("../_components/component.module.css"); + +const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { + const dispatch = useDispatch(); + + const validNickname = useSelector( + (state: RootStateOrAny) => state.credentials.validNickname + ); + const updateComplete = useSelector( + (state: RootStateOrAny) => state.credentials.updateComplete + ); + + useEffect(() => { + dispatch(userActions.getCurrentAuthenticatedUser()); // Get the jwt token after signup + }, []); + + useEffect(() => { + if (validNickname) { + updateCredential(validNickname); + } + }, [validNickname]); + + useEffect(() => { + if (updateComplete) { + history.push("/"); + } + }, [updateComplete]); + + const { username, pin, nickname, credential } = formData; + + async function updateCredential(nickname) { + console.log( + "RegisterKeySuccessStep updateCredential() nickname:", + nickname + ); + try { + let ls_credential = JSON.parse(localStorage.getItem("credential")); + console.log( + "RegisterKeySuccessStep updateCredential() ls_credential:", + ls_credential + ); + + let credentialToUpdate = { + credential: { + credentialId: { + base64: ls_credential.id, + }, + }, + credentialNickname: { + value: nickname, + }, + }; + + dispatch(credentialActions.update(credentialToUpdate)); + } catch (err) { + console.error("RegisterKeySuccessStep continueStep() error"); + console.error(err); + dispatch(alertActions.error(err.message)); + } + localStorage.removeItem("credential"); + } + + function continueStep() { + dispatch(credentialActions.validateCredentialNickname(nickname)); + } + + return ( + <> +
+

Security Key Added

+ +
+
+
+ + + + + + + + + +
+
+ +
+
+ + ); +}; + +export default RegisterKeySuccessStep; diff --git a/clients/web/react/src/RegisterPage/RegisterPage.jsx b/clients/web/react/src/RegisterPage/RegisterPage.jsx deleted file mode 100644 index 540d1f3..0000000 --- a/clients/web/react/src/RegisterPage/RegisterPage.jsx +++ /dev/null @@ -1,306 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import { Link, useHistory } from "react-router-dom"; -import { useDispatch, useSelector } from "react-redux"; -import { Button, Row, Col } from "react-bootstrap"; - -import { create, supported } from "@github/webauthn-json"; -import base64url from "base64url"; -import cbor from "cbor"; -import { Auth } from "aws-amplify"; -import { ServerVerifiedPin } from "../_components"; -import { userActions, credentialActions, alertActions } from "../_actions"; - -const RegisterPage = function () { - const username = localStorage.getItem("username"); - const [submitted, setSubmitted] = useState(false); - const signInResult = useSelector( - (state) => state.authentication.signInResult - ); - const history = useHistory(); - const [cognitoUser, setCognitoUser] = useState({}); - const defaultInvalidPIN = -1; - const dispatch = useDispatch(); - - // reset login status - useEffect(() => { - dispatch(userActions.logout()); - console.log("signInResult: ", signInResult); - return () => { - if (history.action === "POP") { - // Code here will run when back button fires. Note that it's after the `return` for useEffect's callback; code before the return will fire after the page mounts, code after when it is about to unmount. - dispatch(credentialActions.completeUV()); - } - }; - }, []); - - async function handleWebAuthn(e) { - if (submitted === true) { - // do nothing, we are in the middle of the registration ceremony - return; - } - - setSubmitted(true); - - e.preventDefault(); - - console.log("signInResult: ", signInResult); - - // start Registration - const randomString = (length) => - [...Array(length)] - .map(() => Math.floor(Math.random() * 36).toString(36)) - .join(""); - const password = randomString(14); - const usernameLower = username.toLowerCase(); - const attributes = { name: usernameLower }; - - try { - const { user } = await Auth.signUp({ - username, - password, - attributes, - }); - console.log("SignUp: ", user); - } catch (error) { - // A user can get here if they come back to register after the initial registration was interrupted - console.log(error); - } - - try { - const cognitoUser = await Auth.signIn(username); - setCognitoUser(cognitoUser); - console.log("SignIn CognitoUser: ", cognitoUser); - - if ( - cognitoUser.challengeName === "CUSTOM_CHALLENGE" && - cognitoUser.challengeParam.type === "webauthn.get" - ) { - dispatch( - alertActions.error("You have already registered. Please sign in.") - ); - history.push("/login"); - return; - } - - if ( - cognitoUser.challengeName === "CUSTOM_CHALLENGE" && - cognitoUser.challengeParam.type === "webauthn.create" - ) { - console.log( - `registration request: ${JSON.stringify( - cognitoUser.challengeParam, - null, - 2 - )}` - ); - - const request = JSON.parse( - cognitoUser.challengeParam.publicKeyCredentialCreationOptions - ); - console.log("request: ", request); - - if (request.publicKeyCredentialCreationOptions === "error") { - const error = "Error generating public key creation options"; - console.error(error); - setSubmitted(false); - dispatch(alertActions.error(error.toString())); - return; - } - - const publicKey = { - publicKey: request.publicKeyCredentialCreationOptions, - }; - console.log("publicKey, ", publicKey); - - const credential = await create(publicKey); - - console.log(`make credential response: ${JSON.stringify(credential)}`); - - const uv = getUV(credential.response.attestationObject); - console.log(`uv: ${uv}`); - - const challengeResponse = { - credential, - requestId: request.requestId, - pinCode: defaultInvalidPIN, - }; - console.log("challengeResponse: ", challengeResponse); - - if (uv == false) { - dispatch(credentialActions.getUV(challengeResponse)); - } else { - console.log("sendCustomChallengeAnswer: ", cognitoUser); - // to send the answer of the custom challenge - const user = await Auth.sendCustomChallengeAnswer( - cognitoUser, - JSON.stringify(challengeResponse) - ) - .then((user) => { - console.log(user); - - Auth.currentSession() - .then((data) => { - dispatch(alertActions.success("Registration successful")); - const userData = { - id: 1, - username: user.attributes.name, - token: data.getAccessToken().getJwtToken(), - }; - localStorage.setItem("user", JSON.stringify(userData)); - console.log("userData ", localStorage.getItem("user")); - history.push("/"); - }) - .catch((err) => { - console.log("currentSession error: ", err); - dispatch( - alertActions.error("Something went wrong. ", err.message) - ); - setSubmitted(false); - }); - }) - .catch((err) => { - console.log(err); - setSubmitted(false); - dispatch(alertActions.error(err.message)); - }); - } - } else { - const error = "Invalid challengeName and type"; - console.error(error); - setSubmitted(false); - dispatch(alertActions.error(error)); - } - } catch (error) { - console.error("signIn error"); - console.error(error); - setSubmitted(false); - dispatch(alertActions.error(error.toString())); - } - } - - function getUV(attestationObject) { - const attestationBuffer = base64url.toBuffer(attestationObject); - const attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; - const buffer = attestationStruct.authData; - - const flagsBuf = buffer.slice(32, 33); - const flagsInt = flagsBuf[0]; - const flags = { - up: !!(flagsInt & 0x01), - uv: !!(flagsInt & 0x04), - at: !!(flagsInt & 0x40), - ed: !!(flagsInt & 0x80), - flagsInt, - }; - return flags.uv; - } - - const WebAuthn = function () { - if (!supported()) { - return
This browser is not compatible with WebAuthn
; - } - - return ( -
-
-
- -
-
-
- ); - }; - - const UV = function (props) { - const { cognitoUser } = props; - const finishUVRequest = useSelector( - (state) => state.credentials.finishUVRequest - ); - const svpinCreateProps = { - type: "create", - saveCallback: finishUVResponse, - showSelector: finishUVRequest, - }; - const registering = useSelector((state) => state.registration.registering); - - function finishUVResponse(fields) { - if (registering) { - console.log("Already sent the finish regisration request"); - return; - } - - const challengeResponse = finishUVRequest; - console.log( - "sending authenticator response with sv-pin: ", - challengeResponse - ); - challengeResponse.pinCode = parseInt(fields.pin); - - Auth.sendCustomChallengeAnswer( - cognitoUser, - JSON.stringify(challengeResponse) - ) - .then((user) => { - console.log("uv finishUVResponse sendCustomChallengeAnswer: ", user); - - Auth.currentSession() - .then((data) => { - dispatch(alertActions.success("Registration successful")); - const userData = { - id: 1, - username: user.attributes.name, - token: data.getAccessToken().getJwtToken(), - }; - localStorage.setItem("user", JSON.stringify(userData)); - console.log("userData ", localStorage.getItem("user")); - history.push("/"); - }) - .catch((err) => { - console.log("currentSession error: ", err); - dispatch( - alertActions.error("Something went wrong. ", err.message) - ); - setSubmitted(false); - }); - }) - .catch((err) => { - console.log( - "uv finishUVResponse sendCustomChallengeAnswer error: ", - err - ); - const message = "Invalid PIN"; - dispatch(alertActions.error(message)); - setSubmitted(false); - }); - dispatch(credentialActions.completeUV()); - } - - return ; - }; - - return ( - <> -

Hello {username}

- - - - - - - - Cancel - - - - - ); -}; - -export { RegisterPage }; diff --git a/clients/web/react/src/RegisterPage/RegisterSvPinStep.js b/clients/web/react/src/RegisterPage/RegisterSvPinStep.js deleted file mode 100644 index 2bfc91c..0000000 --- a/clients/web/react/src/RegisterPage/RegisterSvPinStep.js +++ /dev/null @@ -1,134 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; -import validate from 'validate.js'; - - -const RegisterSvPinStep = ({ setForm, formData, navigation }) => { - const [validated, setValidated] = useState(false); - - var constraints = { - pin: { - presence: true, - numericality: { - onlyInteger: true, - greaterThan: -1, - }, - length: { - minimum: 4, - maximum: 16 - } - }, - confirmPin: { - equality: "pin" - } - }; - - const [inputs, setInputs] = useState({ - username: localStorage.getItem('username'), - pin: '', - confirmPin: '' - }); - - const [errors, setErrors] = useState({ - pin: '', - confirmPin: '' - }); - - const accountSecurityStep = () => { - navigation.go('AccountSecurityStep'); - } - - const handleChange = (e) => { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - - setValidated(false); - - const result = validate(inputs, constraints); - if (result) { - if (result[name]) { - setErrors(errors => ({ ...errors, [name]: result[name].join(". ") })); - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } - - const handleSubmit = (event) => { - const form = event.currentTarget; - - event.preventDefault(); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - setValidated(true); - - if (isInputValid()) { - accountSecurityStep(); - } - } - - const isInputValid = () => { - if (validate(inputs, constraints)) { - return false; - } - return true; - } - - - return ( - <> -
-

Create your Server-Verified PIN

- -
-
- - - Server Verified PIN - - - - {errors.pin} - - - - - Confirm PIN             - - - - {errors.confirmPin} - - - -
- - ); -}; - -export default RegisterSvPinStep; \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/SignUpStep.js b/clients/web/react/src/RegisterPage/SignUpStep.js deleted file mode 100644 index 7df7183..0000000 --- a/clients/web/react/src/RegisterPage/SignUpStep.js +++ /dev/null @@ -1,179 +0,0 @@ -/* eslint-disable prettier/prettier */ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; -import { useDispatch, useSelector } from 'react-redux'; - -import validate from 'validate.js'; -import { history } from '../_helpers'; -import { WebAuthnClient } from '../_components'; -import { userActions, credentialActions, alertActions } from '../_actions'; -import ServerVerifiedPin from '../_components/ServerVerifiedPin/ServerVerifiedPin'; - - - -const SignUpStep = function({ setForm, formData, navigation }) { - - const dispatch = useDispatch(); - const [serverVerifiedPin, setServerVerifiedPin] = useState(); - - const { username, pin, nickname, credential } = formData; - - const [errors, setErrors] = useState({ - username: '' - }); - const [validated, setValidated] = useState(false); - - const constraints = { - username: { - presence: true, - format: { - pattern: "[a-z0-9_\-]+", - flags: "i", - message: "can only contain a-z, 0-9, or _-" - }, - length: { - minimum: 3, - maximum: 20 - } - } - }; - - const LogInStep = () => { - history.push('/login'); - } - - async function register() { - console.log("register"); - - try { - const options = ""; // default = no platform or cross-platform preference - const userData = await WebAuthnClient.signUp(username, uv); - console.log("SignUpStep register userData: ", userData); - - if (userData === undefined) { - console.error("SignUpStep register error: userData undefined"); - dispatch(alertActions.error("Something went wrong. Please try again.")); - } else { - dispatch(alertActions.success('Registration successful')); - setForm({target: {name: "credential", value: userData.credential}}); - registerKeySuccessStep(userData.credential); - } - - } catch (err) { - console.error("SignUpStep register error"); - console.error(err); - dispatch(alertActions.error(err.message)); - } - } - - const UVPromise = () => { - return new Promise((resolve, reject) => { - const svpinCreateProps = {type: "create", saveCallback: resolve, closeCallback: reject}; - console.log("SignUpStep UVPromise(): ", svpinCreateProps); - setServerVerifiedPin(); - }) - } - - async function uv(challengeResponse) { - dispatch(credentialActions.getUV(challengeResponse)); - const pinResult = await UVPromise(); - console.log("SignUpStep PIN Result: ", pinResult.value); - return pinResult.value; - } - - const registerKeySuccessStep = (credential) => { - localStorage.setItem("credential", JSON.stringify(credential)); - console.log('registerKeySuccessStep credential ', credential); - window.location.reload(); - } - - const handleChange = (e) => { - const { name, value } = e.target; - setForm(e); - - const result = validate({ username: value }, constraints); - if (result) { - setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); - setValidated(false); - - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - setValidated(true); - } - } - - const handleSubmit = async(event) => { - const form = event.currentTarget; - - event.preventDefault(); - - setValidated(true); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - if(isUsernameValid()) { - await register(); - history.push("/"); - } - } - - const isUsernameValid = () => { - if(validate({ username }, constraints)){ - return false; - } - return true; -} - - return ( - <> -
-

Welcome

- -
-
- - - - @ - - - - {errors.username} - - - -
-

Add Your Security Key

- -
-
    -
  1. Make sure your Security Key is nearby
  2. -
  3. Follow the steps in the browser
  4. -
  5. Give your Security Key a nickname to easily identify it later
  6. -
- -
-
-
-
-
-
Already have an account? Log In
-
- {serverVerifiedPin} - - ); -} - -export default SignUpStep; \ No newline at end of file diff --git a/clients/web/react/src/RegisterPage/SignUpStep.tsx b/clients/web/react/src/RegisterPage/SignUpStep.tsx new file mode 100644 index 0000000..6a1a8c8 --- /dev/null +++ b/clients/web/react/src/RegisterPage/SignUpStep.tsx @@ -0,0 +1,190 @@ +/* eslint-disable prettier/prettier */ +import React, { useState, ReactElement } from "react"; +import { Button, InputGroup, FormControl, Form } from "react-bootstrap"; +import { useDispatch } from "react-redux"; + +import validate from "validate.js"; +import { history } from "../_helpers"; +import { WebAuthnClient } from "../_components"; +import { credentialActions, alertActions } from "../_actions"; +import ServerVerifiedPin from "../_components/ServerVerifiedPin/ServerVerifiedPin"; + +const styles = require("../_components/component.module.css"); + +const SignUpStep = function ({ setForm, formData, navigation }) { + const dispatch = useDispatch(); + const [serverVerifiedPin, setServerVerifiedPin] = useState(); + + const { username, pin, nickname, credential } = formData; + + const [errors, setErrors] = useState({ + username: "", + }); + const [validated, setValidated] = useState(false); + + const constraints = { + username: { + presence: true, + format: { + pattern: "[a-z0-9_-]+", + flags: "i", + message: "can only contain a-z, 0-9, or _-", + }, + length: { + minimum: 3, + maximum: 20, + }, + }, + }; + + const LogInStep = () => { + history.push("/login"); + }; + + async function register() { + console.log("register"); + + try { + const options = ""; // default = no platform or cross-platform preference + const userData = await WebAuthnClient.signUp(username, uv); + console.log("SignUpStep register userData: ", userData); + + if (userData === undefined) { + console.error("SignUpStep register error: userData undefined"); + dispatch(alertActions.error("Something went wrong. Please try again.")); + } else { + dispatch(alertActions.success("Registration successful")); + setForm({ target: { name: "credential", value: userData.credential } }); + registerKeySuccessStep(userData.credential); + } + } catch (err) { + console.error("SignUpStep register error"); + console.error(err); + dispatch(alertActions.error(err.message)); + } + } + + const UVPromise = (): Promise<{ value: number }> => { + return new Promise((resolve, reject) => { + const svpinCreateProps = { + type: "create", + saveCallback: resolve, + closeCallback: reject, + }; + console.log("SignUpStep UVPromise(): ", svpinCreateProps); + setServerVerifiedPin(); + }); + }; + + async function uv(challengeResponse) { + dispatch(credentialActions.getUV(challengeResponse)); + const pinResult = await UVPromise(); + console.log("SignUpStep PIN Result: ", pinResult.value); + return pinResult.value; + } + + const registerKeySuccessStep = (credential) => { + localStorage.setItem("credential", JSON.stringify(credential)); + console.log("registerKeySuccessStep credential ", credential); + window.location.reload(); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setForm(e); + + const result = validate({ username: value }, constraints); + if (result) { + setErrors((errors) => ({ + ...errors, + [name]: result.username.join(". "), + })); + setValidated(false); + } else { + setErrors((errors) => ({ ...errors, [name]: undefined })); + setValidated(true); + } + }; + + const handleSubmit = async (event) => { + const form = event.currentTarget; + + event.preventDefault(); + + setValidated(true); + + if (form.checkValidity() === false) { + event.stopPropagation(); + } + + if (isUsernameValid()) { + await register(); + history.push("/"); + } + }; + + const isUsernameValid = () => { + if (validate({ username }, constraints)) { + return false; + } + return true; + }; + + return ( + <> +
+

Welcome

+ +
+
+ + + + @ + + + + {errors.username} + + + +
+

Add Your Security Key

+ +
+
    +
  1. Make sure your Security Key is nearby
  2. +
  3. Follow the steps in the browser
  4. +
  5. Give your Security Key a nickname to easily identify it later
  6. +
+ +
+
+
+
+
+
+ Already have an account?{" "} + + Log In + +
+
+ {serverVerifiedPin} + + ); +}; + +export default SignUpStep; diff --git a/clients/web/react/src/RegisterPage/index.js b/clients/web/react/src/RegisterPage/index.js deleted file mode 100644 index 004f05c..0000000 --- a/clients/web/react/src/RegisterPage/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export * from './RegisterPage'; -export * from './IdentifierFirstSignUpFlowPage'; -export * from './IdentifierFirstSignUpFlow'; \ No newline at end of file From 77baa1aa10ce723e8b334d753f4afae9e9218879 Mon Sep 17 00:00:00 2001 From: csalas Date: Thu, 16 Dec 2021 16:05:49 -0600 Subject: [PATCH 39/66] Migrated helpers, constants, services to TS --- .../web/react/src/_actions/alert.actions.js | 19 -- .../web/react/src/_actions/alert.actions.ts | 21 ++ .../react/src/_actions/credential.actions.js | 254 --------------- .../react/src/_actions/credential.actions.ts | 306 ++++++++++++++++++ clients/web/react/src/_actions/index.js | 6 +- .../web/react/src/_actions/user.actions.js | 101 ------ .../web/react/src/_actions/user.actions.ts | 123 +++++++ .../src/_components/AccountSecurityStep.js | 2 +- .../react/src/_constants/alert.constants.js | 5 - .../react/src/_constants/alert.constants.ts | 7 + .../src/_constants/credential.constants.js | 36 --- .../src/_constants/credential.constants.ts | 38 +++ clients/web/react/src/_constants/index.js | 6 +- .../react/src/_constants/user.constants.js | 47 --- .../react/src/_constants/user.constants.ts | 49 +++ clients/web/react/src/_helpers/history.js | 3 - clients/web/react/src/_helpers/history.ts | 5 + clients/web/react/src/_helpers/index.js | 6 +- clients/web/react/src/_helpers/store.js | 18 +- .../{alert.reducer.js => alert.reducer.ts} | 0 ...n.reducer.js => authentication.reducer.ts} | 0 ...ials.reducer.js => credentials.reducer.ts} | 69 ++-- clients/web/react/src/_reducers/index.js | 12 +- ...es.reducer.js => recoveryCodes.reducer.ts} | 0 ...ion.reducer.js => registration.reducer.ts} | 0 .../{users.reducer.js => users.reducer.ts} | 0 .../react/src/_services/credential.service.js | 182 ----------- .../react/src/_services/credential.service.ts | 148 +++++++++ clients/web/react/src/_services/index.js | 2 - .../web/react/src/_services/user.service.js | 95 ------ .../web/react/src/_services/user.service.ts | 97 ++++++ 31 files changed, 853 insertions(+), 804 deletions(-) delete mode 100644 clients/web/react/src/_actions/alert.actions.js create mode 100644 clients/web/react/src/_actions/alert.actions.ts delete mode 100644 clients/web/react/src/_actions/credential.actions.js create mode 100644 clients/web/react/src/_actions/credential.actions.ts delete mode 100644 clients/web/react/src/_actions/user.actions.js create mode 100644 clients/web/react/src/_actions/user.actions.ts delete mode 100644 clients/web/react/src/_constants/alert.constants.js create mode 100644 clients/web/react/src/_constants/alert.constants.ts delete mode 100644 clients/web/react/src/_constants/credential.constants.js create mode 100644 clients/web/react/src/_constants/credential.constants.ts delete mode 100644 clients/web/react/src/_constants/user.constants.js create mode 100644 clients/web/react/src/_constants/user.constants.ts delete mode 100644 clients/web/react/src/_helpers/history.js create mode 100644 clients/web/react/src/_helpers/history.ts rename clients/web/react/src/_reducers/{alert.reducer.js => alert.reducer.ts} (100%) rename clients/web/react/src/_reducers/{authentication.reducer.js => authentication.reducer.ts} (100%) rename clients/web/react/src/_reducers/{credentials.reducer.js => credentials.reducer.ts} (66%) rename clients/web/react/src/_reducers/{recoveryCodes.reducer.js => recoveryCodes.reducer.ts} (100%) rename clients/web/react/src/_reducers/{registration.reducer.js => registration.reducer.ts} (100%) rename clients/web/react/src/_reducers/{users.reducer.js => users.reducer.ts} (100%) delete mode 100644 clients/web/react/src/_services/credential.service.js create mode 100644 clients/web/react/src/_services/credential.service.ts delete mode 100644 clients/web/react/src/_services/index.js delete mode 100644 clients/web/react/src/_services/user.service.js create mode 100644 clients/web/react/src/_services/user.service.ts diff --git a/clients/web/react/src/_actions/alert.actions.js b/clients/web/react/src/_actions/alert.actions.js deleted file mode 100644 index 3f5a0d3..0000000 --- a/clients/web/react/src/_actions/alert.actions.js +++ /dev/null @@ -1,19 +0,0 @@ -import { alertConstants } from '../_constants'; - -export const alertActions = { - success, - error, - clear -}; - -function success(message) { - return { type: alertConstants.SUCCESS, message }; -} - -function error(message) { - return { type: alertConstants.ERROR, message }; -} - -function clear() { - return { type: alertConstants.CLEAR }; -} \ No newline at end of file diff --git a/clients/web/react/src/_actions/alert.actions.ts b/clients/web/react/src/_actions/alert.actions.ts new file mode 100644 index 0000000..6feaf39 --- /dev/null +++ b/clients/web/react/src/_actions/alert.actions.ts @@ -0,0 +1,21 @@ +import { alertConstants } from "../_constants"; + +const alertActions = { + success, + error, + clear, +}; + +function success(message) { + return { type: alertConstants.SUCCESS, message }; +} + +function error(message) { + return { type: alertConstants.ERROR, message }; +} + +function clear() { + return { type: alertConstants.CLEAR }; +} + +export { alertActions }; diff --git a/clients/web/react/src/_actions/credential.actions.js b/clients/web/react/src/_actions/credential.actions.js deleted file mode 100644 index 80e3f43..0000000 --- a/clients/web/react/src/_actions/credential.actions.js +++ /dev/null @@ -1,254 +0,0 @@ -import { credentialConstants } from '../_constants'; -import { credentialService } from '../_services'; -import { alertActions } from '.'; -import validate from 'validate.js'; - -export const credentialActions = { - generateRecoveryCodes, - listRecoveryCodes, - update, - updatePin, - registerStart, - registerFinish, - getAll, - getUV, - completeUV, - delete: _delete, - validateCredentialNickname -}; - -const constraints = { - nickname: { - length: { - maximum: 20 - } - } - }; - -function generateRecoveryCodes() { - return dispatch => { - dispatch(request()); - - credentialService.generateRecoveryCodes() - .then( - data => { - dispatch(success(data)); - }, - error => { - dispatch(failure(error.toString())); - dispatch(alertActions.error(error.toString())); - } - ); - }; - - function request() { return { type: credentialConstants.GENERATE_CODES_REQUEST } } - function success(codes) { return { type: credentialConstants.GENERATE_CODES_SUCCESS, codes } } - function failure(error) { return { type: credentialConstants.GENERATE_CODES_FAILURE, error } } -} - -function listRecoveryCodes() { - return dispatch => { - dispatch(request()); - - credentialService.listRecoveryCodes() - .then( - count => { - dispatch(success(count)); - }, - error => { - dispatch(failure(error.toString())); - dispatch(alertActions.error(error.toString())); - } - ); - }; - - function request() { return { type: credentialConstants.LIST_CODES_REQUEST } } - function success(count) { return { type: credentialConstants.LIST_CODES_SUCCESS, count } } - function failure(error) { return { type: credentialConstants.LIST_CODES_FAILURE, error } } -} - -function update(credential) { - return dispatch => { - dispatch(request({ credential })); - - credentialService.update(credential) - .then( - credential => { - dispatch(success(credential)); - dispatch(alertActions.success('Update successful')); - }, - error => { - dispatch(failure(error.toString())); - dispatch(alertActions.error(error.toString())); - } - ); - }; - - function request(credential) { return { type: credentialConstants.UPDATE_REQUEST, credential } } - function success(credential) { return { type: credentialConstants.UPDATE_SUCCESS, credential } } - function failure(error) { return { type: credentialConstants.UPDATE_FAILURE, error } } -} - -function updatePin(fields) { - return dispatch => { - dispatch(request({ fields })); - - credentialService.updatePin(fields) - .then( - response => { - dispatch(success(response)); - dispatch(alertActions.success('Update successful')); - }, - error => { - dispatch(failure(error.toString())); - dispatch(alertActions.error(error.toString())); - } - ); - }; - - function request(response) { return { type: credentialConstants.UPDATE_REQUEST, response } } - function success(response) { return { type: credentialConstants.UPDATE_SUCCESS, response } } - function failure(error) { return { type: credentialConstants.UPDATE_FAILURE, error } } -} - -function registerStart(registration) { - return dispatch => { - dispatch(request(registration)); - - credentialService.registerStart(registration) - .then( - registration => { - dispatch(success(registration)); - }, - error => { - dispatch(failure(error.toString())); - dispatch(alertActions.error(error.toString())); - } - ); - }; - - function request(registration) { return { type: credentialConstants.REGISTER_START_REQUEST, registration } } - function success(registration) { return { type: credentialConstants.REGISTER_START_SUCCESS, registration } } - function failure(error) { return { type: credentialConstants.REGISTER_START_FAILURE, error } } -} - -function registerFinish(registration) { - return dispatch => { - dispatch(request(registration)); - - credentialService.registerFinish(registration) - .then( - registration => { - console.log("credential.actions registerFinish registration: ", registration); - if (registration === undefined) { - dispatch(failure('Registration failed')); - dispatch(alertActions.error('Registration failed')); - } else { - dispatch(success(registration)); - dispatch(alertActions.success('Registration successful')); - } - }, - error => { - dispatch(failure(error.toString())); - dispatch(alertActions.error(error.toString())); - } - ); - }; - - function request(registration) { return { type: credentialConstants.REGISTER_FINISH_REQUEST, registration } } - function success(registration) { return { type: credentialConstants.REGISTER_FINISH_SUCCESS, registration } } - function failure(error) { return { type: credentialConstants.REGISTER_FINISH_FAILURE, error } } -} - -function getAll(id) { - return dispatch => { - dispatch(request()); - - credentialService.getAll(id) - .then( - credentials => dispatch(success(credentials)), - error => dispatch(failure(error.toString())) - ); - }; - - function request() { return { type: credentialConstants.GETALL_REQUEST } } - function success(credentials) { return { type: credentialConstants.GETALL_SUCCESS, credentials } } - function failure(error) { return { type: credentialConstants.GETALL_FAILURE, error } } -} - -function getUV(uvRequest) { - return dispatch => { - dispatch(request(uvRequest)); - - /*credentialService.getAll(id) - .then( - credentials => dispatch(success(credentials)), - error => dispatch(failure(error.toString())) - );*/ - }; - - function request(uvRequest) { return { type: credentialConstants.GETUV_REQUEST, uvRequest } } - //function success(credentials) { return { type: credentialConstants.GETALL_SUCCESS, credentials } } - //function failure(error) { return { type: credentialConstants.GETALL_FAILURE, error } } -} - -function completeUV() { - return dispatch => { - dispatch(success()); - - /*credentialService.getAll(id) - .then( - credentials => dispatch(success(credentials)), - error => dispatch(failure(error.toString())) - );*/ - }; - - //function request(uvRequest) { return { type: credentialConstants.GETUV_REQUEST, uvRequest } } - function success() { return { type: credentialConstants.GETUV_COMPLETE } } - //function failure(error) { return { type: credentialConstants.GETALL_FAILURE, error } } -} - -// prefixed function name with underscore because delete is a reserved word in javascript -function _delete(id) { - return dispatch => { - dispatch(request(id)); - - credentialService.delete(id) - .then( - credentials => { - dispatch(success(id)); - dispatch(alertActions.success('Delete credential successful')); - }, - error => { - dispatch(failure(id, error.toString())); - } - ); - }; - - function request(id) { return { type: credentialConstants.DELETE_REQUEST, id } } - function success(id) { return { type: credentialConstants.DELETE_SUCCESS, id } } - function failure(id, error) { return { type: credentialConstants.DELETE_FAILURE, id, error } } -} - -function validateCredentialNickname(nickname) { - return dispatch => { - dispatch(request(nickname)); - - let result = validate({nickname: nickname}, constraints); - - if(result) { - - let error = result.nickname.join(". "); - dispatch(failure(error.toString())); - dispatch(alertActions.error(error.toString())); - - } else { - dispatch(success(nickname)); - } - - }; - - function request(nickname) { return { type: credentialConstants.NICKNAME_REQUEST, nickname } } - function success(nickname) { return { type: credentialConstants.NICKNAME_SUCCESS, nickname } } - function failure(nickname, error) { return { type: credentialConstants.NICKNAME_FAILURE, nickname, error } } -} diff --git a/clients/web/react/src/_actions/credential.actions.ts b/clients/web/react/src/_actions/credential.actions.ts new file mode 100644 index 0000000..d1d191e --- /dev/null +++ b/clients/web/react/src/_actions/credential.actions.ts @@ -0,0 +1,306 @@ +import { credentialConstants } from "../_constants"; +import credentialService from "../_services/credential.service"; +import { alertActions } from "."; +import validate from "validate.js"; + +const credentialActions = { + generateRecoveryCodes, + listRecoveryCodes, + update, + updatePin, + registerStart, + registerFinish, + getAll, + getUV, + completeUV, + delete: _delete, + validateCredentialNickname, +}; + +const constraints = { + nickname: { + length: { + maximum: 20, + }, + }, +}; + +function generateRecoveryCodes() { + return (dispatch) => { + dispatch(request()); + + credentialService.generateRecoveryCodes().then( + (data) => { + dispatch(success(data)); + }, + (error) => { + dispatch(failure(error.toString())); + dispatch(alertActions.error(error.toString())); + } + ); + }; + + function request() { + return { type: credentialConstants.GENERATE_CODES_REQUEST }; + } + function success(codes) { + return { type: credentialConstants.GENERATE_CODES_SUCCESS, codes }; + } + function failure(error) { + return { type: credentialConstants.GENERATE_CODES_FAILURE, error }; + } +} + +function listRecoveryCodes() { + return (dispatch) => { + dispatch(request()); + + credentialService.listRecoveryCodes().then( + (count) => { + dispatch(success(count)); + }, + (error) => { + dispatch(failure(error.toString())); + dispatch(alertActions.error(error.toString())); + } + ); + }; + + function request() { + return { type: credentialConstants.LIST_CODES_REQUEST }; + } + function success(count) { + return { type: credentialConstants.LIST_CODES_SUCCESS, count }; + } + function failure(error) { + return { type: credentialConstants.LIST_CODES_FAILURE, error }; + } +} + +function update(credential) { + return (dispatch) => { + dispatch(request({ credential })); + + credentialService.update(credential).then( + (credential) => { + dispatch(success(credential)); + dispatch(alertActions.success("Update successful")); + }, + (error) => { + dispatch(failure(error.toString())); + dispatch(alertActions.error(error.toString())); + } + ); + }; + + function request(credential) { + return { type: credentialConstants.UPDATE_REQUEST, credential }; + } + function success(credential) { + return { type: credentialConstants.UPDATE_SUCCESS, credential }; + } + function failure(error) { + return { type: credentialConstants.UPDATE_FAILURE, error }; + } +} + +function updatePin(fields) { + return (dispatch) => { + dispatch(request({ fields })); + + credentialService.updatePin(fields).then( + (response) => { + dispatch(success(response)); + dispatch(alertActions.success("Update successful")); + }, + (error) => { + dispatch(failure(error.toString())); + dispatch(alertActions.error(error.toString())); + } + ); + }; + + function request(response) { + return { type: credentialConstants.UPDATE_REQUEST, response }; + } + function success(response) { + return { type: credentialConstants.UPDATE_SUCCESS, response }; + } + function failure(error) { + return { type: credentialConstants.UPDATE_FAILURE, error }; + } +} + +function registerStart(registration) { + return (dispatch) => { + dispatch(request(registration)); + + credentialService.registerStart(registration).then( + (registration) => { + dispatch(success(registration)); + }, + (error) => { + dispatch(failure(error.toString())); + dispatch(alertActions.error(error.toString())); + } + ); + }; + + function request(registration) { + return { type: credentialConstants.REGISTER_START_REQUEST, registration }; + } + function success(registration) { + return { type: credentialConstants.REGISTER_START_SUCCESS, registration }; + } + function failure(error) { + return { type: credentialConstants.REGISTER_START_FAILURE, error }; + } +} + +function registerFinish(registration) { + return (dispatch) => { + dispatch(request(registration)); + + credentialService.registerFinish(registration).then( + (registration) => { + console.log( + "credential.actions registerFinish registration: ", + registration + ); + if (registration === undefined) { + dispatch(failure("Registration failed")); + dispatch(alertActions.error("Registration failed")); + } else { + dispatch(success(registration)); + dispatch(alertActions.success("Registration successful")); + } + }, + (error) => { + dispatch(failure(error.toString())); + dispatch(alertActions.error(error.toString())); + } + ); + }; + + function request(registration) { + return { type: credentialConstants.REGISTER_FINISH_REQUEST, registration }; + } + function success(registration) { + return { type: credentialConstants.REGISTER_FINISH_SUCCESS, registration }; + } + function failure(error) { + return { type: credentialConstants.REGISTER_FINISH_FAILURE, error }; + } +} + +function getAll(id) { + return (dispatch) => { + dispatch(request()); + + credentialService.getAll(id).then( + (credentials) => dispatch(success(credentials)), + (error) => dispatch(failure(error.toString())) + ); + }; + + function request() { + return { type: credentialConstants.GETALL_REQUEST }; + } + function success(credentials) { + return { type: credentialConstants.GETALL_SUCCESS, credentials }; + } + function failure(error) { + return { type: credentialConstants.GETALL_FAILURE, error }; + } +} + +function getUV(uvRequest) { + return (dispatch) => { + dispatch(request(uvRequest)); + + /*credentialService.getAll(id) + .then( + credentials => dispatch(success(credentials)), + error => dispatch(failure(error.toString())) + );*/ + }; + + function request(uvRequest) { + return { type: credentialConstants.GETUV_REQUEST, uvRequest }; + } + //function success(credentials) { return { type: credentialConstants.GETALL_SUCCESS, credentials } } + //function failure(error) { return { type: credentialConstants.GETALL_FAILURE, error } } +} + +function completeUV() { + return (dispatch) => { + dispatch(success()); + + /*credentialService.getAll(id) + .then( + credentials => dispatch(success(credentials)), + error => dispatch(failure(error.toString())) + );*/ + }; + + //function request(uvRequest) { return { type: credentialConstants.GETUV_REQUEST, uvRequest } } + function success() { + return { type: credentialConstants.GETUV_COMPLETE }; + } + //function failure(error) { return { type: credentialConstants.GETALL_FAILURE, error } } +} + +// prefixed function name with underscore because delete is a reserved word in javascript +function _delete(id) { + return (dispatch) => { + dispatch(request(id)); + + credentialService.delete(id).then( + (credentials) => { + dispatch(success(id)); + dispatch(alertActions.success("Delete credential successful")); + }, + (error) => { + dispatch(failure(id, error.toString())); + } + ); + }; + + function request(id) { + return { type: credentialConstants.DELETE_REQUEST, id }; + } + function success(id) { + return { type: credentialConstants.DELETE_SUCCESS, id }; + } + function failure(id, error) { + return { type: credentialConstants.DELETE_FAILURE, id, error }; + } +} + +function validateCredentialNickname(nickname) { + return (dispatch) => { + dispatch(request(nickname)); + + let result = validate({ nickname: nickname }, constraints); + + if (result) { + let error = result.nickname.join(". "); + dispatch(failure(result, error.toString())); + dispatch(alertActions.error(error.toString())); + } else { + dispatch(success(nickname)); + } + }; + + function request(nickname) { + return { type: credentialConstants.NICKNAME_REQUEST, nickname }; + } + function success(nickname) { + return { type: credentialConstants.NICKNAME_SUCCESS, nickname }; + } + function failure(nickname, error) { + return { type: credentialConstants.NICKNAME_FAILURE, nickname, error }; + } +} + +export { credentialActions }; diff --git a/clients/web/react/src/_actions/index.js b/clients/web/react/src/_actions/index.js index a8dd47a..0349d72 100644 --- a/clients/web/react/src/_actions/index.js +++ b/clients/web/react/src/_actions/index.js @@ -1,3 +1,3 @@ -export * from './alert.actions'; -export * from './user.actions'; -export * from './credential.actions'; +export { alertActions } from './alert.actions'; +export { credentialActions } from './credential.actions'; +export { userActions } from './user.actions' diff --git a/clients/web/react/src/_actions/user.actions.js b/clients/web/react/src/_actions/user.actions.js deleted file mode 100644 index 6c9a233..0000000 --- a/clients/web/react/src/_actions/user.actions.js +++ /dev/null @@ -1,101 +0,0 @@ -import { userConstants } from '../_constants'; -import { userService } from '../_services'; -import { alertActions } from './'; -import { history } from '../_helpers'; - -export const userActions = { - webAuthnStart, - logout, - exists, - delete: _delete, - getCurrentAuthenticatedUser -}; - -function webAuthnStart() { - return dispatch => { - dispatch(request()); - - userService.webAuthnStart() - .then( - response => { - dispatch(success(response)); - }, - error => { - dispatch(failure(error.toString())); - dispatch(alertActions.error(error.toString())); - } - ); - }; - - function request() { return { type: userConstants.WEBAUTHN_START_REQUEST } } - function success(response) { return { type: userConstants.WEBAUTHN_START_SUCCESS, response } } - function failure(error) { return { type: userConstants.WEBAUTHN_START_FAILURE, error } } -} - -function exists(username) { - return dispatch => { - dispatch(request({ username })); - - localStorage.setItem('username', username); - - userService.exists(username) - .then( - user => { - // Exists in cognito - dispatch(success(user)); - history.push('/loginWithSecurityKey'); - }, - error => { - // Does not exist in cognito - dispatch(failure(error)); - history.push('/register'); - } - ); - }; - - function request(user) { return { type: userConstants.EXISTS_REQUEST, user } } - function success(user) { return { type: userConstants.EXISTS_SUCCESS, user } } - function failure(error) { return { type: userConstants.EXISTS_FAILURE, error } } -} - -function logout() { - userService.logout(); - return { type: userConstants.LOGOUT }; -} - -// prefixed function name with underscore because delete is a reserved word in javascript -function _delete(jwt) { - return dispatch => { - dispatch(request()); - - userService.delete(jwt) - .then( - user => dispatch(success()), - error => dispatch(failure(error.toString())) - ); - }; - - function request() { return { type: userConstants.DELETE_REQUEST } } - function success() { return { type: userConstants.DELETE_SUCCESS } } - function failure(error) { return { type: userConstants.DELETE_FAILURE, error } } -} - -function getCurrentAuthenticatedUser() { - return dispatch => { - dispatch(request()); - - userService.getCurrentAuthenticatedUser() - .then( - user => { - dispatch(success(user)); - }, - error => { - dispatch(failure(error)); - } - ); - }; - - function request() { return { type: userConstants.CURRENT_USER_REQUEST } } - function success(user) { return { type: userConstants.CURRENT_USER_SUCCESS, user } } - function failure(error) { return { type: userConstants.CURRENT_USER_FAILURE, error } } -} \ No newline at end of file diff --git a/clients/web/react/src/_actions/user.actions.ts b/clients/web/react/src/_actions/user.actions.ts new file mode 100644 index 0000000..3d78435 --- /dev/null +++ b/clients/web/react/src/_actions/user.actions.ts @@ -0,0 +1,123 @@ +import { userConstants } from "../_constants"; +import userService from "../_services/user.service"; +import { alertActions } from "./"; +import { history } from "../_helpers"; + +const userActions = { + webAuthnStart, + logout, + exists, + delete: _delete, + getCurrentAuthenticatedUser, +}; + +function webAuthnStart() { + return (dispatch) => { + dispatch(request()); + + userService.webAuthnStart().then( + (response) => { + dispatch(success(response)); + }, + (error) => { + dispatch(failure(error.toString())); + dispatch(alertActions.error(error.toString())); + } + ); + }; + + function request() { + return { type: userConstants.WEBAUTHN_START_REQUEST }; + } + function success(response) { + return { type: userConstants.WEBAUTHN_START_SUCCESS, response }; + } + function failure(error) { + return { type: userConstants.WEBAUTHN_START_FAILURE, error }; + } +} + +function exists(username) { + return (dispatch) => { + dispatch(request({ username })); + + localStorage.setItem("username", username); + + userService.exists(username).then( + (user) => { + // Exists in cognito + dispatch(success(user)); + history.push("/loginWithSecurityKey"); + }, + (error) => { + // Does not exist in cognito + dispatch(failure(error)); + history.push("/register"); + } + ); + }; + + function request(user) { + return { type: userConstants.EXISTS_REQUEST, user }; + } + function success(user) { + return { type: userConstants.EXISTS_SUCCESS, user }; + } + function failure(error) { + return { type: userConstants.EXISTS_FAILURE, error }; + } +} + +function logout() { + userService.logout(); + return { type: userConstants.LOGOUT }; +} + +// prefixed function name with underscore because delete is a reserved word in javascript +function _delete(jwt) { + return (dispatch) => { + dispatch(request()); + + userService.delete(jwt).then( + (user) => dispatch(success()), + (error) => dispatch(failure(error.toString())) + ); + }; + + function request() { + return { type: userConstants.DELETE_REQUEST }; + } + function success() { + return { type: userConstants.DELETE_SUCCESS }; + } + function failure(error) { + return { type: userConstants.DELETE_FAILURE, error }; + } +} + +function getCurrentAuthenticatedUser() { + return (dispatch) => { + dispatch(request()); + + userService.getCurrentAuthenticatedUser().then( + (user) => { + dispatch(success(user)); + }, + (error) => { + dispatch(failure(error)); + } + ); + }; + + function request() { + return { type: userConstants.CURRENT_USER_REQUEST }; + } + function success(user) { + return { type: userConstants.CURRENT_USER_SUCCESS, user }; + } + function failure(error) { + return { type: userConstants.CURRENT_USER_FAILURE, error }; + } +} + +export { userActions }; diff --git a/clients/web/react/src/_components/AccountSecurityStep.js b/clients/web/react/src/_components/AccountSecurityStep.js index 43f0612..aed00de 100644 --- a/clients/web/react/src/_components/AccountSecurityStep.js +++ b/clients/web/react/src/_components/AccountSecurityStep.js @@ -1,7 +1,7 @@ import React, { useState, useEffect, useRef, Profiler } from 'react'; import { Button, Card, InputGroup, FormControl, Table, ListGroup, Image, Container, Row, Col, Modal, Alert } from 'react-bootstrap'; import { useDispatch, useSelector } from 'react-redux'; -import { userActions, credentialActions, alertActions } from '../_actions'; +import { userActions, credentialActions } from '../_actions'; import { WebAuthnClient } from './WebAuthnClient'; import styles from "./component.module.css"; diff --git a/clients/web/react/src/_constants/alert.constants.js b/clients/web/react/src/_constants/alert.constants.js deleted file mode 100644 index 16981c7..0000000 --- a/clients/web/react/src/_constants/alert.constants.js +++ /dev/null @@ -1,5 +0,0 @@ -export const alertConstants = { - SUCCESS: 'ALERT_SUCCESS', - ERROR: 'ALERT_ERROR', - CLEAR: 'ALERT_CLEAR' -}; diff --git a/clients/web/react/src/_constants/alert.constants.ts b/clients/web/react/src/_constants/alert.constants.ts new file mode 100644 index 0000000..d9eb797 --- /dev/null +++ b/clients/web/react/src/_constants/alert.constants.ts @@ -0,0 +1,7 @@ +const alertConstants = { + SUCCESS: "ALERT_SUCCESS", + ERROR: "ALERT_ERROR", + CLEAR: "ALERT_CLEAR", +}; + +export { alertConstants }; diff --git a/clients/web/react/src/_constants/credential.constants.js b/clients/web/react/src/_constants/credential.constants.js deleted file mode 100644 index 2fed621..0000000 --- a/clients/web/react/src/_constants/credential.constants.js +++ /dev/null @@ -1,36 +0,0 @@ -export const credentialConstants = { - REGISTER_START_REQUEST: 'CREDENTIAL_REGISTER_START_REQUEST', - REGISTER_START_SUCCESS: 'CREDENTIAL_REGISTER_START_SUCCESS', - REGISTER_START_FAILURE: 'CREDENTIAL_REGISTER_START_FAILURE', - - REGISTER_FINISH_REQUEST: 'CREDENTIAL_REGISTER_FINISH_REQUEST', - REGISTER_FINISH_SUCCESS: 'CREDENTIAL_REGISTER_FINISH_SUCCESS', - REGISTER_FINISH_FAILURE: 'CREDENTIAL_REGISTER_FINISH_FAILURE', - - UPDATE_REQUEST: 'CREDENTIAL_UPDATE_REQUEST', - UPDATE_SUCCESS: 'CREDENTIAL_UPDATE_SUCCESS', - UPDATE_FAILURE: 'CREDENTIAL_UPDATE_FAILURE', - - GETALL_REQUEST: 'CREDENTIAL_GETALL_REQUEST', - GETALL_SUCCESS: 'CREDENTIAL_GETALL_SUCCESS', - GETALL_FAILURE: 'CREDENTIAL_GETALL_FAILURE', - - GENERATE_CODES_REQUEST: 'CREDENTIAL_GENERATE_CODES_REQUEST', - GENERATE_CODES_SUCCESS: 'CREDENTIAL_GENERATE_CODES_SUCCESS', - GENERATE_CODES_FAILURE: 'CREDENTIAL_GENERATE_CODES_FAILURE', - - LIST_CODES_REQUEST: 'CREDENTIAL_LIST_CODES_REQUEST', - LIST_CODES_SUCCESS: 'CREDENTIAL_LIST_CODES_SUCCESS', - LIST_CODES_FAILURE: 'CREDENTIAL_LIST_CODES_FAILURE', - - GETUV_REQUEST: 'CREDENTIAL_GETUV_REQUEST', - GETUV_COMPLETE: 'CREDENTIAL_GETUV_COMPLETE', - - DELETE_REQUEST: 'CREDENTIAL_DELETE_REQUEST', - DELETE_SUCCESS: 'CREDENTIAL_DELETE_SUCCESS', - DELETE_FAILURE: 'CREDENTIAL_DELETE_FAILURE', - - NICKNAME_REQUEST: 'CREDENTIAL_NICKNAME_REQUEST', - NICKNAME_SUCCESS: 'CREDENTIAL_NICKNAME_SUCCESS', - NICKNAME_FAILURE: 'CREDENTIAL_NICKNAME_FAILURE' -}; diff --git a/clients/web/react/src/_constants/credential.constants.ts b/clients/web/react/src/_constants/credential.constants.ts new file mode 100644 index 0000000..550bf42 --- /dev/null +++ b/clients/web/react/src/_constants/credential.constants.ts @@ -0,0 +1,38 @@ +const credentialConstants = { + REGISTER_START_REQUEST: "CREDENTIAL_REGISTER_START_REQUEST", + REGISTER_START_SUCCESS: "CREDENTIAL_REGISTER_START_SUCCESS", + REGISTER_START_FAILURE: "CREDENTIAL_REGISTER_START_FAILURE", + + REGISTER_FINISH_REQUEST: "CREDENTIAL_REGISTER_FINISH_REQUEST", + REGISTER_FINISH_SUCCESS: "CREDENTIAL_REGISTER_FINISH_SUCCESS", + REGISTER_FINISH_FAILURE: "CREDENTIAL_REGISTER_FINISH_FAILURE", + + UPDATE_REQUEST: "CREDENTIAL_UPDATE_REQUEST", + UPDATE_SUCCESS: "CREDENTIAL_UPDATE_SUCCESS", + UPDATE_FAILURE: "CREDENTIAL_UPDATE_FAILURE", + + GETALL_REQUEST: "CREDENTIAL_GETALL_REQUEST", + GETALL_SUCCESS: "CREDENTIAL_GETALL_SUCCESS", + GETALL_FAILURE: "CREDENTIAL_GETALL_FAILURE", + + GENERATE_CODES_REQUEST: "CREDENTIAL_GENERATE_CODES_REQUEST", + GENERATE_CODES_SUCCESS: "CREDENTIAL_GENERATE_CODES_SUCCESS", + GENERATE_CODES_FAILURE: "CREDENTIAL_GENERATE_CODES_FAILURE", + + LIST_CODES_REQUEST: "CREDENTIAL_LIST_CODES_REQUEST", + LIST_CODES_SUCCESS: "CREDENTIAL_LIST_CODES_SUCCESS", + LIST_CODES_FAILURE: "CREDENTIAL_LIST_CODES_FAILURE", + + GETUV_REQUEST: "CREDENTIAL_GETUV_REQUEST", + GETUV_COMPLETE: "CREDENTIAL_GETUV_COMPLETE", + + DELETE_REQUEST: "CREDENTIAL_DELETE_REQUEST", + DELETE_SUCCESS: "CREDENTIAL_DELETE_SUCCESS", + DELETE_FAILURE: "CREDENTIAL_DELETE_FAILURE", + + NICKNAME_REQUEST: "CREDENTIAL_NICKNAME_REQUEST", + NICKNAME_SUCCESS: "CREDENTIAL_NICKNAME_SUCCESS", + NICKNAME_FAILURE: "CREDENTIAL_NICKNAME_FAILURE", +}; + +export { credentialConstants }; diff --git a/clients/web/react/src/_constants/index.js b/clients/web/react/src/_constants/index.js index d0b87fa..1ae7ccb 100644 --- a/clients/web/react/src/_constants/index.js +++ b/clients/web/react/src/_constants/index.js @@ -1,3 +1,3 @@ -export * from './alert.constants'; -export * from './user.constants'; -export * from './credential.constants'; \ No newline at end of file +export { alertConstants } from './alert.constants'; +export { credentialConstants } from "./credential.constants"; +export { userConstants } from "./user.constants" \ No newline at end of file diff --git a/clients/web/react/src/_constants/user.constants.js b/clients/web/react/src/_constants/user.constants.js deleted file mode 100644 index 38cc5ea..0000000 --- a/clients/web/react/src/_constants/user.constants.js +++ /dev/null @@ -1,47 +0,0 @@ -export const userConstants = { - REGISTER_REQUEST: 'USERS_REGISTER_REQUEST', - REGISTER_SUCCESS: 'USERS_REGISTER_SUCCESS', - REGISTER_FAILURE: 'USERS_REGISTER_FAILURE', - - REGISTER_START_REQUEST: 'USERS_REGISTER_START_REQUEST', - REGISTER_START_SUCCESS: 'USERS_REGISTER_START_SUCCESS', - REGISTER_START_FAILURE: 'USERS_REGISTER_START_FAILURE', - - REGISTER_FINISH_REQUEST: 'USERS_REGISTER_FINISH_REQUEST', - REGISTER_FINISH_SUCCESS: 'USERS_REGISTER_FINISH_SUCCESS', - REGISTER_FINISH_FAILURE: 'USERS_REGISTER_FINISH_FAILURE', - - LOGIN_REQUEST: 'USERS_LOGIN_REQUEST', - LOGIN_SUCCESS: 'USERS_LOGIN_SUCCESS', - LOGIN_FAILURE: 'USERS_LOGIN_FAILURE', - - WEBAUTHN_START_REQUEST: 'WEBAUTHN_START_REQUEST', - WEBAUTHN_START_SUCCESS: 'WEBAUTHN_START_SUCCESS', - WEBAUTHN_START_FAILURE: 'WEBAUTHN_START_FAILURE', - - WEBAUTHN_FINISH_REQUEST: 'WEBAUTHN_FINISH_REQUEST', - WEBAUTHN_FINISH_SUCCESS: 'WEBAUTHN_FINISH_LOGIN_SUCCESS', - WEBAUTHN_FINISH_FAILURE: 'WEBAUTHN_FINISH_LOGIN_FAILURE', - - LOGOUT: 'USERS_LOGOUT', - - EXISTS_REQUEST: 'USERS_EXISTS_REQUEST', - EXISTS_SUCCESS: 'USERS_EXISTS_SUCCESS', - EXISTS_FAILURE: 'USERS_EXISTS_FAILURE', - - GETALL_REQUEST: 'USERS_GETALL_REQUEST', - GETALL_SUCCESS: 'USERS_GETALL_SUCCESS', - GETALL_FAILURE: 'USERS_GETALL_FAILURE', - - UPDATE_REQUEST: 'USERS_UPDATE_REQUEST', - UPDATE_SUCCESS: 'USERS_UPDATE_SUCCESS', - UPDATE_FAILURE: 'USERS_UPDATE_FAILURE', - - DELETE_REQUEST: 'USERS_DELETE_REQUEST', - DELETE_SUCCESS: 'USERS_DELETE_SUCCESS', - DELETE_FAILURE: 'USERS_DELETE_FAILURE', - - CURRENT_USER_REQUEST: 'CURRENT_USER_REQUEST', - CURRENT_USER_SUCCESS: 'CURRENT_USER_SUCCESS', - CURRENT_USER_FAILURE: 'CURRENT_USER_FAILURE' -}; diff --git a/clients/web/react/src/_constants/user.constants.ts b/clients/web/react/src/_constants/user.constants.ts new file mode 100644 index 0000000..2729809 --- /dev/null +++ b/clients/web/react/src/_constants/user.constants.ts @@ -0,0 +1,49 @@ +const userConstants = { + REGISTER_REQUEST: "USERS_REGISTER_REQUEST", + REGISTER_SUCCESS: "USERS_REGISTER_SUCCESS", + REGISTER_FAILURE: "USERS_REGISTER_FAILURE", + + REGISTER_START_REQUEST: "USERS_REGISTER_START_REQUEST", + REGISTER_START_SUCCESS: "USERS_REGISTER_START_SUCCESS", + REGISTER_START_FAILURE: "USERS_REGISTER_START_FAILURE", + + REGISTER_FINISH_REQUEST: "USERS_REGISTER_FINISH_REQUEST", + REGISTER_FINISH_SUCCESS: "USERS_REGISTER_FINISH_SUCCESS", + REGISTER_FINISH_FAILURE: "USERS_REGISTER_FINISH_FAILURE", + + LOGIN_REQUEST: "USERS_LOGIN_REQUEST", + LOGIN_SUCCESS: "USERS_LOGIN_SUCCESS", + LOGIN_FAILURE: "USERS_LOGIN_FAILURE", + + WEBAUTHN_START_REQUEST: "WEBAUTHN_START_REQUEST", + WEBAUTHN_START_SUCCESS: "WEBAUTHN_START_SUCCESS", + WEBAUTHN_START_FAILURE: "WEBAUTHN_START_FAILURE", + + WEBAUTHN_FINISH_REQUEST: "WEBAUTHN_FINISH_REQUEST", + WEBAUTHN_FINISH_SUCCESS: "WEBAUTHN_FINISH_LOGIN_SUCCESS", + WEBAUTHN_FINISH_FAILURE: "WEBAUTHN_FINISH_LOGIN_FAILURE", + + LOGOUT: "USERS_LOGOUT", + + EXISTS_REQUEST: "USERS_EXISTS_REQUEST", + EXISTS_SUCCESS: "USERS_EXISTS_SUCCESS", + EXISTS_FAILURE: "USERS_EXISTS_FAILURE", + + GETALL_REQUEST: "USERS_GETALL_REQUEST", + GETALL_SUCCESS: "USERS_GETALL_SUCCESS", + GETALL_FAILURE: "USERS_GETALL_FAILURE", + + UPDATE_REQUEST: "USERS_UPDATE_REQUEST", + UPDATE_SUCCESS: "USERS_UPDATE_SUCCESS", + UPDATE_FAILURE: "USERS_UPDATE_FAILURE", + + DELETE_REQUEST: "USERS_DELETE_REQUEST", + DELETE_SUCCESS: "USERS_DELETE_SUCCESS", + DELETE_FAILURE: "USERS_DELETE_FAILURE", + + CURRENT_USER_REQUEST: "CURRENT_USER_REQUEST", + CURRENT_USER_SUCCESS: "CURRENT_USER_SUCCESS", + CURRENT_USER_FAILURE: "CURRENT_USER_FAILURE", +}; + +export { userConstants }; diff --git a/clients/web/react/src/_helpers/history.js b/clients/web/react/src/_helpers/history.js deleted file mode 100644 index 629039e..0000000 --- a/clients/web/react/src/_helpers/history.js +++ /dev/null @@ -1,3 +0,0 @@ -import { createBrowserHistory } from 'history'; - -export const history = createBrowserHistory(); \ No newline at end of file diff --git a/clients/web/react/src/_helpers/history.ts b/clients/web/react/src/_helpers/history.ts new file mode 100644 index 0000000..db26163 --- /dev/null +++ b/clients/web/react/src/_helpers/history.ts @@ -0,0 +1,5 @@ +import { createBrowserHistory } from "history"; + +const history = createBrowserHistory(); + +export { history }; diff --git a/clients/web/react/src/_helpers/index.js b/clients/web/react/src/_helpers/index.js index a9ee505..2204ccb 100644 --- a/clients/web/react/src/_helpers/index.js +++ b/clients/web/react/src/_helpers/index.js @@ -1,4 +1,4 @@ export * from './fake-backend'; -export * from './history'; -export * from './store'; -export * from './auth-header'; \ No newline at end of file +export * from './auth-header'; +export * from "./store"; +export { history } from "./history" \ No newline at end of file diff --git a/clients/web/react/src/_helpers/store.js b/clients/web/react/src/_helpers/store.js index 0620008..fde22c4 100644 --- a/clients/web/react/src/_helpers/store.js +++ b/clients/web/react/src/_helpers/store.js @@ -1,14 +1,12 @@ -import { createStore, applyMiddleware } from 'redux'; -import thunkMiddleware from 'redux-thunk'; -import { createLogger } from 'redux-logger'; -import rootReducer from '../_reducers'; +import { createStore, applyMiddleware } from "redux"; +import thunkMiddleware from "redux-thunk"; +import { createLogger } from "redux-logger"; +import rootReducer from "../_reducers"; const loggerMiddleware = createLogger(); export const store = createStore( - rootReducer, - applyMiddleware( - thunkMiddleware, - loggerMiddleware - ) -); \ No newline at end of file + rootReducer, + applyMiddleware(thunkMiddleware, loggerMiddleware) +); + diff --git a/clients/web/react/src/_reducers/alert.reducer.js b/clients/web/react/src/_reducers/alert.reducer.ts similarity index 100% rename from clients/web/react/src/_reducers/alert.reducer.js rename to clients/web/react/src/_reducers/alert.reducer.ts diff --git a/clients/web/react/src/_reducers/authentication.reducer.js b/clients/web/react/src/_reducers/authentication.reducer.ts similarity index 100% rename from clients/web/react/src/_reducers/authentication.reducer.js rename to clients/web/react/src/_reducers/authentication.reducer.ts diff --git a/clients/web/react/src/_reducers/credentials.reducer.js b/clients/web/react/src/_reducers/credentials.reducer.ts similarity index 66% rename from clients/web/react/src/_reducers/credentials.reducer.js rename to clients/web/react/src/_reducers/credentials.reducer.ts index a744ac8..867f008 100644 --- a/clients/web/react/src/_reducers/credentials.reducer.js +++ b/clients/web/react/src/_reducers/credentials.reducer.ts @@ -1,49 +1,50 @@ -import { credentialConstants } from '../_constants'; +import { credentialConstants } from "../_constants"; +import { RootStateOrAny } from "react-redux"; -export function credentials(state = {}, action) { +export function credentials(state: RootStateOrAny = {}, action) { switch (action.type) { case credentialConstants.GETALL_REQUEST: return { - loading: true + loading: true, }; case credentialConstants.GETALL_SUCCESS: return { items: action.credentials.fido, recoveryCodesViewed: action.credentials.recoveryCodesViewed, - allRecoveryCodesUsed: action.credentials.allRecoveryCodesUsed + allRecoveryCodesUsed: action.credentials.allRecoveryCodesUsed, }; case credentialConstants.GETALL_FAILURE: - return { - error: action.error + return { + error: action.error, }; case credentialConstants.GETUV_REQUEST: - return { - finishUVRequest: action.uvRequest + return { + finishUVRequest: action.uvRequest, }; case credentialConstants.GETUV_COMPLETE: - return { - finishUVRequest: undefined + return { + finishUVRequest: undefined, }; case credentialConstants.DELETE_REQUEST: // add 'deleting:true' property to credential being deleted return { ...state, - items: state.items.map(credential => + items: state.items.map((credential) => credential.id === action.id ? { ...credential, deleting: true } : credential - ) + ), }; case credentialConstants.DELETE_SUCCESS: // remove deleted credential from state return { - items: state.items.filter(credential => credential.id !== action.id) + items: state.items.filter((credential) => credential.id !== action.id), }; case credentialConstants.DELETE_FAILURE: - // remove 'deleting:true' property and add 'deleteError:[error]' property to credential + // remove 'deleting:true' property and add 'deleteError:[error]' property to credential return { ...state, - items: state.items.map(credential => { + items: state.items.map((credential) => { if (credential.id === action.id) { // make copy of credential without 'deleting:true' property const { deleting, ...credentialCopy } = credential; @@ -52,49 +53,49 @@ export function credentials(state = {}, action) { } return credential; - }) + }), }; case credentialConstants.REGISTER_START_REQUEST: return { - registering: true + registering: true, }; case credentialConstants.REGISTER_START_SUCCESS: return { - registrationResponse: action.registration + registrationResponse: action.registration, }; case credentialConstants.REGISTER_START_FAILURE: - return { - error: action.error + return { + error: action.error, }; case credentialConstants.REGISTER_FINISH_REQUEST: return { - registering: true + registering: true, }; case credentialConstants.REGISTER_FINISH_SUCCESS: return { - registrationResponse: action.registration + registrationResponse: action.registration, }; case credentialConstants.REGISTER_FINISH_FAILURE: - return { - error: action.error + return { + error: action.error, }; case credentialConstants.NICKNAME_SUCCESS: - return { - validNickname: action.nickname + return { + validNickname: action.nickname, }; case credentialConstants.NICKNAME_FAILURE: - return { - error: action.error + return { + error: action.error, }; case credentialConstants.UPDATE_SUCCESS: - return { - updateComplete: action.type + return { + updateComplete: action.type, }; case credentialConstants.UPDATE_FAILURE: - return { - updateComplete: action.type + return { + updateComplete: action.type, }; default: - return state + return state; } -} \ No newline at end of file +} diff --git a/clients/web/react/src/_reducers/index.js b/clients/web/react/src/_reducers/index.js index 44eae30..9155c30 100644 --- a/clients/web/react/src/_reducers/index.js +++ b/clients/web/react/src/_reducers/index.js @@ -1,11 +1,11 @@ import { combineReducers } from 'redux'; -import { authentication } from './authentication.reducer'; -import { registration } from './registration.reducer'; -import { users } from './users.reducer'; -import { alert } from './alert.reducer'; -import { credentials } from './credentials.reducer'; -import { recoveryCodes } from './recoveryCodes.reducer'; +import { authentication as authentication } from './authentication.reducer'; +import { registration as registration } from './registration.reducer'; +import { users as users } from './users.reducer'; +import { alert as alert } from './alert.reducer'; +import { credentials as credentials } from './credentials.reducer'; +import { recoveryCodes as recoveryCodes } from './recoveryCodes.reducer'; const rootReducer = combineReducers({ authentication, diff --git a/clients/web/react/src/_reducers/recoveryCodes.reducer.js b/clients/web/react/src/_reducers/recoveryCodes.reducer.ts similarity index 100% rename from clients/web/react/src/_reducers/recoveryCodes.reducer.js rename to clients/web/react/src/_reducers/recoveryCodes.reducer.ts diff --git a/clients/web/react/src/_reducers/registration.reducer.js b/clients/web/react/src/_reducers/registration.reducer.ts similarity index 100% rename from clients/web/react/src/_reducers/registration.reducer.js rename to clients/web/react/src/_reducers/registration.reducer.ts diff --git a/clients/web/react/src/_reducers/users.reducer.js b/clients/web/react/src/_reducers/users.reducer.ts similarity index 100% rename from clients/web/react/src/_reducers/users.reducer.js rename to clients/web/react/src/_reducers/users.reducer.ts diff --git a/clients/web/react/src/_services/credential.service.js b/clients/web/react/src/_services/credential.service.js deleted file mode 100644 index 5259c2f..0000000 --- a/clients/web/react/src/_services/credential.service.js +++ /dev/null @@ -1,182 +0,0 @@ -import config from 'config'; -import { authHeader } from '../_helpers'; -import axios from 'axios'; -import aws_exports from '../aws-exports'; - -axios.defaults.baseURL = aws_exports.apiEndpoint; - -export const credentialService = { - generateRecoveryCodes, - listRecoveryCodes, - update, - updatePin, - registerStart, - registerFinish, - getAll, - getById, - delete: _delete -}; - - -async function generateRecoveryCodes() { - try { - const response = await axios.delete('/users/credentials/codes'); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -async function listRecoveryCodes() { - try { - const response = await axios.get('/users/credentials/codes'); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -async function update(credential) { - /*const requestOptions = { - method: 'PUT', - headers: authHeader(), - body: JSON.stringify({ credential }) - }; - - return fetch(`${config.apiUrl}/credentials`, requestOptions).then(handleResponse);*/ - - try { - const response = await axios.put('/users/credentials/fido2', credential); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -async function updatePin(fields) { - /*const requestOptions = { - method: 'PUT', - headers: authHeader(), - body: JSON.stringify({ credential }) - }; - - return fetch(`${config.apiUrl}/credentials`, requestOptions).then(handleResponse);*/ - - try { - const response = await axios.post('/users/credentials/pin', fields); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -async function getAll(jwt) { - /* - const requestOptions = { - method: 'GET', - headers: authHeader() - }; - - return fetch(`${config.apiUrl}/credentials/byuser/${id}`, requestOptions).then(handleResponse); - */ - axios.defaults.headers.common['Authorization'] = jwt; - try { - const response = await axios.get('/users/credentials'); - console.log("getAll response: ", response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -function getById(id) { - const requestOptions = { - method: 'GET', - headers: authHeader() - }; - - return fetch(`${config.apiUrl}/credentials/${id}`, requestOptions).then(handleResponse); -} - -async function registerStart(registration) { - /*const requestOptions = { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(registration) - }; - - return fetch(`${config.apiUrl}/credentials/register`, requestOptions).then(handleResponse);*/ - console.log("registraiton: ",registration) - try { - const response = await axios.post('/users/credentials/fido2/register', registration); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -async function registerFinish(registration) { - /*const requestOptions = { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(registration) - }; - - return fetch(`${config.apiUrl}/credentials/register/finish`, requestOptions).then(handleResponse);*/ - try { - const response = await axios.post('/users/credentials/fido2/register/finish', registration); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -// prefixed function name with underscore because delete is a reserved word in javascript -async function _delete(id) { - /*const requestOptions = { - method: 'DELETE', - headers: authHeader() - }; - - return fetch(`${config.apiUrl}/credentials/${id}`, requestOptions).then(handleResponse);*/ - - try { - const response = await axios.delete('/users/credentials/fido2?id='+id); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -function handleResponse(response) { - return response.text().then(text => { - const data = text && JSON.parse(text); - if (!response.ok) { - if (response.status === 401) { - // auto logout if 401 response returned from api - logout(); - location.reload(true); - } - - const error = (data && data.message) || response.statusText; - return Promise.reject(error); - } - - return data; - }); -} \ No newline at end of file diff --git a/clients/web/react/src/_services/credential.service.ts b/clients/web/react/src/_services/credential.service.ts new file mode 100644 index 0000000..bb28c4c --- /dev/null +++ b/clients/web/react/src/_services/credential.service.ts @@ -0,0 +1,148 @@ +//import config from 'config'; +//import { authHeader } from '../_helpers'; +import axios from "axios"; +import aws_exports from "../aws-exports"; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +const credentialService = { + generateRecoveryCodes, + listRecoveryCodes, + update, + updatePin, + registerStart, + registerFinish, + getAll, + //getById, + delete: _delete, +}; + +async function generateRecoveryCodes() { + try { + const response = await axios.delete("/users/credentials/codes"); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +async function listRecoveryCodes() { + try { + const response = await axios.get("/users/credentials/codes"); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +async function update(credential) { + try { + const response = await axios.put("/users/credentials/fido2", credential); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +async function updatePin(fields) { + try { + const response = await axios.post("/users/credentials/pin", fields); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +async function getAll(jwt) { + axios.defaults.headers.common["Authorization"] = jwt; + try { + const response = await axios.get("/users/credentials"); + console.log("getAll response: ", response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +/* +function getById(id) { + const requestOptions = { + method: 'GET', + headers: authHeader() + }; + + return fetch(`${config.apiUrl}/credentials/${id}`, requestOptions).then(handleResponse); +} +*/ + +async function registerStart(registration) { + console.log("registraiton: ", registration); + try { + const response = await axios.post( + "/users/credentials/fido2/register", + registration + ); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +async function registerFinish(registration) { + try { + const response = await axios.post( + "/users/credentials/fido2/register/finish", + registration + ); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +// prefixed function name with underscore because delete is a reserved word in javascript +async function _delete(id) { + try { + const response = await axios.delete("/users/credentials/fido2?id=" + id); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +/* +function handleResponse(response) { + return response.text().then(text => { + const data = text && JSON.parse(text); + if (!response.ok) { + if (response.status === 401) { + // auto logout if 401 response returned from api + logout(); + location.reload(true); + } + + const error = (data && data.message) || response.statusText; + return Promise.reject(error); + } + + return data; + }); +} +*/ + +export default credentialService; diff --git a/clients/web/react/src/_services/index.js b/clients/web/react/src/_services/index.js deleted file mode 100644 index bcd024a..0000000 --- a/clients/web/react/src/_services/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './user.service'; -export * from './credential.service'; \ No newline at end of file diff --git a/clients/web/react/src/_services/user.service.js b/clients/web/react/src/_services/user.service.js deleted file mode 100644 index e4e081f..0000000 --- a/clients/web/react/src/_services/user.service.js +++ /dev/null @@ -1,95 +0,0 @@ -import config from 'config'; -import { authHeader } from '../_helpers'; - -import { Auth } from 'aws-amplify'; -import axios from 'axios'; -import aws_exports from '../aws-exports'; - -axios.defaults.baseURL = aws_exports.apiEndpoint; - -export const userService = { - webAuthnStart, - logout, - exists, - delete: _delete, - getCurrentAuthenticatedUser -}; - -async function webAuthnStart() { - try { - const response = await axios.get('/users/credentials/fido2/authenticate'); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -async function logout() { - // remove user from local storage to log user out - localStorage.removeItem('user'); - try { - await Auth.signOut(); - } catch (error) { - console.log('Error while signing out', error); - } -} - -async function exists(username) { - const _username = username.toLowerCase(); - try { - let cognitoUser = await Auth.signIn(_username); - if (cognitoUser.challengeName === 'CUSTOM_CHALLENGE' && cognitoUser.challengeParam.type === 'webauthn.get') { - return cognitoUser; - } else { - // user exists but no credentials, registration may have been interrupted - return _error(cognitoUser); - } - } catch (error) { - return _error(error); - } -} - -// prefixed function name with underscore because delete is a reserved word in javascript -async function _delete(jwt) { - - axios.defaults.headers.common['Authorization'] = jwt; - try { - const response = await axios.delete('/users'); - console.log(response); - return response.data; - } catch (error) { - console.error(error); - Promise.reject(error); - } -} - -async function getCurrentAuthenticatedUser() { - - try { - let currentUser = await Auth.currentAuthenticatedUser({ - bypassCache: true // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data - }); - console.log("getCurrentAuthenticatedUser currentAuthenticatedUser", currentUser); - - let data = await Auth.currentSession(); - console.log("getCurrentAuthenticatedUser data: ", data); - let userData = { - id: 1, - username: currentUser.username, - credential: JSON.parse(localStorage.getItem('credential')), - token: data.getIdToken().getJwtToken() - } - localStorage.setItem('user', JSON.stringify(userData)); - axios.defaults.headers.common['Authorization'] = userData.token; - return userData; - } catch (error) { - Promise.reject(error); - } - -} - -function _error(response) { - return Promise.reject(JSON.stringify(response)); -} diff --git a/clients/web/react/src/_services/user.service.ts b/clients/web/react/src/_services/user.service.ts new file mode 100644 index 0000000..cda9761 --- /dev/null +++ b/clients/web/react/src/_services/user.service.ts @@ -0,0 +1,97 @@ +import { Auth } from "aws-amplify"; +import axios from "axios"; +import aws_exports from "../aws-exports"; + +axios.defaults.baseURL = aws_exports.apiEndpoint; + +const userService = { + webAuthnStart, + logout, + exists, + delete: _delete, + getCurrentAuthenticatedUser, +}; + +async function webAuthnStart() { + try { + const response = await axios.get("/users/credentials/fido2/authenticate"); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +async function logout() { + // remove user from local storage to log user out + localStorage.removeItem("user"); + try { + await Auth.signOut(); + } catch (error) { + console.log("Error while signing out", error); + } +} + +async function exists(username) { + const _username = username.toLowerCase(); + try { + let cognitoUser = await Auth.signIn(_username); + if ( + cognitoUser.challengeName === "CUSTOM_CHALLENGE" && + cognitoUser.challengeParam.type === "webauthn.get" + ) { + return cognitoUser; + } else { + // user exists but no credentials, registration may have been interrupted + return _error(cognitoUser); + } + } catch (error) { + return _error(error); + } +} + +// prefixed function name with underscore because delete is a reserved word in javascript +async function _delete(jwt) { + axios.defaults.headers.common["Authorization"] = jwt; + try { + const response = await axios.delete("/users"); + console.log(response); + return response.data; + } catch (error) { + console.error(error); + Promise.reject(error); + } +} + +async function getCurrentAuthenticatedUser() { + try { + let currentUser = await Auth.currentAuthenticatedUser({ + bypassCache: true, // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data + }); + console.log( + "getCurrentAuthenticatedUser currentAuthenticatedUser", + currentUser + ); + + let data = await Auth.currentSession(); + console.log("getCurrentAuthenticatedUser data: ", data); + let userData = { + id: 1, + username: currentUser.username, + credential: JSON.parse(localStorage.getItem("credential")), + token: data.getIdToken().getJwtToken(), + }; + localStorage.setItem("user", JSON.stringify(userData)); + axios.defaults.headers.common["Authorization"] = userData.token; + return userData; + } catch (error) { + Promise.reject(error); + } +} + +function _error(response) { + return Promise.reject(JSON.stringify(response)); +} + +export default userService; From b1f4b736520fd55de765c1325a1e45bde576aac8 Mon Sep 17 00:00:00 2001 From: csalas Date: Fri, 17 Dec 2021 09:41:17 -0600 Subject: [PATCH 40/66] TS added to the store class. Adding .vscode to gitignore --- .gitignore | 1 + clients/web/react/src/_helpers/index.js | 2 +- clients/web/react/src/_helpers/{store.js => store.ts} | 7 ++++--- clients/web/react/src/{index.jsx => index.tsx} | 0 4 files changed, 6 insertions(+), 4 deletions(-) rename clients/web/react/src/_helpers/{store.js => store.ts} (54%) rename clients/web/react/src/{index.jsx => index.tsx} (100%) diff --git a/.gitignore b/.gitignore index e950a79..9cdec91 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ xcuserdata/ *.xccheckout *.xcscmblueprint *.DS_Store +*.vscode ## Obj-C/Swift specific *.hmap diff --git a/clients/web/react/src/_helpers/index.js b/clients/web/react/src/_helpers/index.js index 2204ccb..5fe7cca 100644 --- a/clients/web/react/src/_helpers/index.js +++ b/clients/web/react/src/_helpers/index.js @@ -1,4 +1,4 @@ export * from './fake-backend'; export * from './auth-header'; -export * from "./store"; +export { store } from "./store"; export { history } from "./history" \ No newline at end of file diff --git a/clients/web/react/src/_helpers/store.js b/clients/web/react/src/_helpers/store.ts similarity index 54% rename from clients/web/react/src/_helpers/store.js rename to clients/web/react/src/_helpers/store.ts index fde22c4..f045014 100644 --- a/clients/web/react/src/_helpers/store.js +++ b/clients/web/react/src/_helpers/store.ts @@ -1,12 +1,13 @@ -import { createStore, applyMiddleware } from "redux"; +import { createStore, applyMiddleware, Middleware } from "redux"; import thunkMiddleware from "redux-thunk"; import { createLogger } from "redux-logger"; import rootReducer from "../_reducers"; -const loggerMiddleware = createLogger(); +const loggerMiddleware = createLogger() as Middleware; -export const store = createStore( +const store = createStore( rootReducer, applyMiddleware(thunkMiddleware, loggerMiddleware) ); +export { store }; diff --git a/clients/web/react/src/index.jsx b/clients/web/react/src/index.tsx similarity index 100% rename from clients/web/react/src/index.jsx rename to clients/web/react/src/index.tsx From e9c8e3fbd7b569b3d6d865b2ce481dcd75369a3d Mon Sep 17 00:00:00 2001 From: csalas Date: Fri, 17 Dec 2021 10:29:56 -0600 Subject: [PATCH 41/66] Cleaned components folder, migrated webauthnclient to TS, and minor UI fixes to home and login --- clients/web/react/src/LoginPage/LogInStep.tsx | 2 +- .../src/_components/AccountSecurityStep.js | 382 ------------------ .../_components/Credential/CredentialList.tsx | 2 +- .../web/react/src/_components/ForgotStep.js | 80 ---- .../src/_components/IdentifierFirstFlow.jsx | 75 ---- .../src/_components/LogInTrustedDeviceStep.js | 41 -- .../web/react/src/_components/LoginStep.js | 149 ------- .../web/react/src/_components/LogoutStep.js | 23 -- .../react/src/_components/PrivateRoute.jsx | 10 - .../react/src/_components/PrivateRoute.tsx | 19 + .../react/src/_components/PromptSvPinStep.js | 119 ------ .../RecoveryCodes/RecoveryCodes.tsx | 2 +- .../_components/RegisterDeviceSuccessStep.js | 38 -- .../src/_components/RegisterKeySuccessStep.js | 40 -- .../src/_components/RegisterSvPinStep.js | 135 ------- .../_components/RegisterTrustedDeviceStep.js | 49 --- .../src/_components/ServerVerifiedPin.jsx | 225 ----------- .../web/react/src/_components/SignUpStep.js | 126 ------ .../src/_components/UserVerificationClient.js | 53 --- .../{WebAuthnClient.js => WebAuthnClient.ts} | 37 +- clients/web/react/src/_components/index.js | 6 +- 21 files changed, 47 insertions(+), 1566 deletions(-) delete mode 100644 clients/web/react/src/_components/AccountSecurityStep.js delete mode 100644 clients/web/react/src/_components/ForgotStep.js delete mode 100644 clients/web/react/src/_components/IdentifierFirstFlow.jsx delete mode 100644 clients/web/react/src/_components/LogInTrustedDeviceStep.js delete mode 100644 clients/web/react/src/_components/LoginStep.js delete mode 100644 clients/web/react/src/_components/LogoutStep.js delete mode 100644 clients/web/react/src/_components/PrivateRoute.jsx create mode 100644 clients/web/react/src/_components/PrivateRoute.tsx delete mode 100644 clients/web/react/src/_components/PromptSvPinStep.js delete mode 100644 clients/web/react/src/_components/RegisterDeviceSuccessStep.js delete mode 100644 clients/web/react/src/_components/RegisterKeySuccessStep.js delete mode 100644 clients/web/react/src/_components/RegisterSvPinStep.js delete mode 100644 clients/web/react/src/_components/RegisterTrustedDeviceStep.js delete mode 100644 clients/web/react/src/_components/ServerVerifiedPin.jsx delete mode 100644 clients/web/react/src/_components/SignUpStep.js delete mode 100644 clients/web/react/src/_components/UserVerificationClient.js rename clients/web/react/src/_components/{WebAuthnClient.js => WebAuthnClient.ts} (93%) diff --git a/clients/web/react/src/LoginPage/LogInStep.tsx b/clients/web/react/src/LoginPage/LogInStep.tsx index 23bb562..5c3e962 100644 --- a/clients/web/react/src/LoginPage/LogInStep.tsx +++ b/clients/web/react/src/LoginPage/LogInStep.tsx @@ -257,7 +257,7 @@ const LogInStep = function ({ navigation }) {
- OR + OR
- - - - Edit {credential.credentialNickname} - - - - - **placeholder for edit nickname** - - - Last Used Time: {credential.lastUsedTime} - - - Last Updated Time: {credential.lastUpdatedTime} - - - Registration Time: {credential.registrationTime} - - - - - - - - - - - ); - } - - return ( - <> -
-
- -
-
-
{credential.credentialNickname}
-
YubiKey 5NFC
-

{credential.lastUsedTime}

-
-
- -
-
-
- - ); - } - - //TODO Change SV-PIN - - //TODO Generate recovery codes - function RecoveryCodes() { - //let recoveryCodesViewed = credentials.recoveryCodesViewed; //For Cody's reference, this is found in FIDO2KitAPI, gets added to the payload - //let allRecoveryCodesUsed = credentials.allRecoveryCodesUsed; - //const recoveryCodes = useSelector(state => state.recoveryCodes); - let recoveryCodesViewed = false - let allRecoveryCodesUsed = false; - const recoveryCodes = { - loading: false, - generating: false, - error: '', - codesRemaining: 3, - codes: [ - '5e010f7cde664f98a8c003e220ff0084', - 'e2ef5f92c32a427885795af52c2ddaea', - '53d7a9899a7947dd8646d481baee685e', - '510afd0c813c45df87116275588c067b', - '510afd0c813c45df87116275588c067b' - ] - } - const [showCodes, setShowCodes] = useState(false); - - const handleClose = () => { - setShowCodes(false); - } - const handleShow = () => { - setShowCodes(true); - //dispatch(credentialActions.recoveryCodesViewed()); - } - const handleGenerate = () => { - setShowCodes(true); - //dispatch(credentialActions.generateRecoveryCodes()); - } - - useEffect(() => { - if(recoveryCodesViewed === false || allRecoveryCodesUsed) { - handleShow(); - } - }, [recoveryCodesViewed, allRecoveryCodesUsed]); - - return ( - <> - -
Recovery Options
- - - -
- - - Recovery Codes - - - - If you lose you all your authenticators and don't have the recovery codes you will lose access to your account. - {recoveryCodes.loading && Loading recovery codes...} - {recoveryCodes.generating && Generating recovery codes...} - {recoveryCodes.error && ERROR: {recoveryCodes.error}} - {recoveryCodes.codesRemaining && (recoveryCodes.codesRemaining === 0) ? Please generate new recovery codes now. : ''} - {recoveryCodes.codes && -
    -
  • {recoveryCodes.codes[0]}
  • -
  • {recoveryCodes.codes[1]}
  • -
  • {recoveryCodes.codes[2]}
  • -
  • {recoveryCodes.codes[3]}
  • -
  • {recoveryCodes.codes[4]}
  • -
- } - {recoveryCodes.codes && Save your recovery codes now. They will not be shown again.} - {recoveryCodes.codesRemaining && (recoveryCodes.codesRemaining > 0) ? {recoveryCodes.codesRemaining} recovery codes remaining. : ''} - {allRecoveryCodesUsed && (!recoveryCodes.generating || !recoveryCodes.codes) && All recovery codes have been used. Please generate new recovery codes now.} -

-
Generate new recovery codes
- - -
- - - -
- - ) - } - - function DeleteUser() { - const [show, setShow] = useState(false); - const handleShow = () => { - setShow(true); - } - const handleClose = () => { - setShow(false); - } - const handleDelete = () => { - navigation.go('LogOutStep'); - } - /** - const handleDelete = () => { - setShow(false); - Auth.currentAuthenticatedUser().then((user) => new Promise((resolve, reject) => { - user.deleteUser(error => { - if(error) { - return reject(error); - } - dispatch(userActions.delete(userData.token)); - navigation.go('LogOutStep'); - - resolve(); - }); - })) - .catch(error => { - console.error(error); - dispatch(alertActions.error(error.message)); - }); - } - */ - - return ( - <> - -
Delete Account
- - - -
- - - Delete Account - - - - - - - - - - - ); - } - - const logOut = () => { - dispatch(userActions.logout()); - navigation.go('LogOutStep') - } - - return ( - <> -
-

Account Security

-
-
- -
Trusted Devices
- - - - - - - - - - - - - - - - - - - -
Safari on macOS. Registered: May 26, 2021
Safari on macOS. Registered: April 26, 2021
Safari on macOS. Registered: March 26, 2021
-
-
- -
Security Keys
- - {credentials.map((credential, index) => - - )} - - -
- -
Server Verified PIN
- - - - Old PIN         - - - - - - New PIN       - - - - - - Confirm PIN - - - - - -
- - -
-
-
-
-
Log Out
-
-
- - ); -}; - -export default AccountSecurityStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/Credential/CredentialList.tsx b/clients/web/react/src/_components/Credential/CredentialList.tsx index ce18a6f..4175b16 100644 --- a/clients/web/react/src/_components/Credential/CredentialList.tsx +++ b/clients/web/react/src/_components/Credential/CredentialList.tsx @@ -10,7 +10,7 @@ const CredentialList = function ({ credentialItems }) { console.log("Printing the credentials, ", credentialItems); return ( - +
Security Keys
diff --git a/clients/web/react/src/_components/ForgotStep.js b/clients/web/react/src/_components/ForgotStep.js deleted file mode 100644 index 8b41232..0000000 --- a/clients/web/react/src/_components/ForgotStep.js +++ /dev/null @@ -1,80 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; - -import styles from "./component.module.css"; - -const ForgotStep = ({ setForm, formData, navigation }) => { - const [validated, setValidated] = useState(false); - - const [inputs, setInputs] = useState({ - username: localStorage.getItem('username'), - recoveryCode: undefined - }); - - const LogInStep = () => { - navigation.go('LogInStep'); - } - const accountSecurityStep = () => { - navigation.go('AccountSecurityStep'); - } - - const handleChange = (e) => { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - - setValidated(false); - } - - const handleSubmit = (event) => { - const form = event.currentTarget; - - event.preventDefault(); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - setValidated(true); - - if (inputs.recoveryCode) { - accountSecurityStep(); - } - } - - return ( - <> -
-

Forgot Your Security Key?

- -
-
- - - Recovery Code - - - - Please provide a recover code. - - - -
-
-
-
-
-
Back to Log In
-
- - ); -}; - -export default ForgotStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/IdentifierFirstFlow.jsx b/clients/web/react/src/_components/IdentifierFirstFlow.jsx deleted file mode 100644 index 7cafa5f..0000000 --- a/clients/web/react/src/_components/IdentifierFirstFlow.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from "react"; -import { Card } from 'react-bootstrap'; -import { useStep } from "react-hooks-helper"; - -import LogInStep from "./LogInStep"; -import SignUpStep from "./SignUpStep"; -import RegisterSvPinStep from "./RegisterSvPinStep"; -import ForgotStep from "./ForgotStep"; -import PromptSvPinStep from "./PromptSvPinStep"; -import RegisterTrustedDeviceStep from "./RegisterTrustedDeviceStep"; -import LogInTrustedDeviceStep from "./LogInTrustedDeviceStep"; -import RegisterKeySuccessStep from "./RegisterKeySuccessStep"; -import RegisterDeviceSuccessStep from "./RegisterDeviceSuccessStep"; -import AccountSecurityStep from "./AccountSecurityStep"; -import LogOutStep from "./LogoutStep"; - -const steps = [ - { id: "LogInStep" }, - { id: "SignUpStep" }, - { id: "RegisterSvPinStep" }, - { id: "ForgotStep" }, - { id: "PromptSvPinStep" }, - { id: "RegisterTrustedDeviceStep" }, - { id: "LogInTrustedDeviceStep" }, - { id: "RegisterKeySuccessStep" }, - { id: "RegisterDeviceSuccessStep" }, - { id: "AccountSecurityStep" }, - { id: "LogOutStep"} -]; - -export const IdentifierFirstFlow = ({ images }) => { - let trustedDevice = localStorage.getItem('trustedDevice'); - const _initialStep = trustedDevice === "true" ? 6 : 0; - const { step, navigation } = useStep({ initialStep: _initialStep, steps }); - - const { id } = step; - - const props = { navigation, step }; - - const renderSwitch = (id) => { - switch (id) { - case "LogInStep": - return ; - case "SignUpStep": - return ; - case "RegisterSvPinStep": - return ; - case "ForgotStep": - return ; - case "PromptSvPinStep": - return ; - case "RegisterTrustedDeviceStep": - return ; - case "LogInTrustedDeviceStep": - return ; - case "RegisterKeySuccessStep": - return ; - case "RegisterDeviceSuccessStep": - return ; - case "AccountSecurityStep": - return ; - case "LogOutStep": - return ; - default: - return null; - } - }; - - return ( - <> - {renderSwitch(id)} - - ); - -} \ No newline at end of file diff --git a/clients/web/react/src/_components/LogInTrustedDeviceStep.js b/clients/web/react/src/_components/LogInTrustedDeviceStep.js deleted file mode 100644 index c924ac5..0000000 --- a/clients/web/react/src/_components/LogInTrustedDeviceStep.js +++ /dev/null @@ -1,41 +0,0 @@ -import React from "react"; -import { Button, Label } from 'react-bootstrap'; - -import styles from "./component.module.css"; - -const LogInTrustedDeviceStep = ({ setForm, formData, navigation }) => { - - const LogInStep = () => { - navigation.go('LogInStep'); - } - - const accountSecurityStep = () => { - navigation.go('AccountSecurityStep'); - } - - - return ( - <> -
-

Welcome

- -
-
-
-
-
-
- -
-
-
-
-
-
Try Another Method
-
-
- - ); -}; - -export default LogInTrustedDeviceStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/LoginStep.js b/clients/web/react/src/_components/LoginStep.js deleted file mode 100644 index c15c945..0000000 --- a/clients/web/react/src/_components/LoginStep.js +++ /dev/null @@ -1,149 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, Form } from 'react-bootstrap'; -import validate from 'validate.js'; - -import styles from "./component.module.css"; - -const LogInStep = ({ navigation }) => { - const [inputs, setInputs] = useState({ - username: localStorage.getItem('username'), - forgotStep: false, - continue: false - }); - const [errors, setErrors] = useState({ - username: '' - }); - const [validated, setValidated] = useState(false); - - const constraints = { - username: { - presence: true, - format: { - pattern: "[a-z0-9_\-]+", - flags: "i", - message: "can only contain a-z, 0-9, or _-" - }, - length: { - minimum: 3, - maximum: 20 - } - } - }; - - const promptSvPinStep = () => { - navigation.go('PromptSvPinStep'); - } - const signUpStep = () => { - navigation.go('SignUpStep'); - } - const forgotStep = () => { - navigation.go('ForgotStep'); - } - const accountSecurityStep = () => { - navigation.go('AccountSecurityStep'); - } - - const forgotClickHandler = () => { - setInputs(inputs => ({ ...inputs, ["continue"]: false })); - setInputs(inputs => ({ ...inputs, ["forgotStep"]: true })); - } - - const continueClickHandler = () => { - setInputs(inputs => ({ ...inputs, ["continue"]: true })); - setInputs(inputs => ({ ...inputs, ["forgotStep"]: false })); - } - - const handleChange = (e) => { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - - setValidated(false); - - const result = validate({ username: value }, constraints); - if (result) { - setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } - - const handleSubmit = (event) => { - const form = event.currentTarget; - - event.preventDefault(); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - if(isUsernameValid()) { - setValidated(true); - localStorage.setItem('username', inputs.username); - if(inputs.continue === true) { - promptSvPinStep(); - } else if (inputs.forgotStep === true) { - forgotStep(); - } - - } else { - setValidated(false); - } - } - - const isUsernameValid = () => { - if(validate({ username: inputs.username }, constraints)){ - return false; - } - return true; - } - - - return ( - <> -
-

Welcome

- -
-
- - - - @ - - - - {errors.username} - - - - - -

-
-
- OR -
-
- -
-
-
-
-
-
Don't have an account? Sign Up
-
- - ); -}; - -export default LogInStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/LogoutStep.js b/clients/web/react/src/_components/LogoutStep.js deleted file mode 100644 index 43ad6ca..0000000 --- a/clients/web/react/src/_components/LogoutStep.js +++ /dev/null @@ -1,23 +0,0 @@ -import React, { useEffect } from 'react'; - -import { Spinner } from 'react-bootstrap'; - -const LogOutStep = ({ navigation }) => { - useEffect(() => { - setTimeout(function () { - console.log('Called into loader'); - navigation.go('LogInStep'); - }, 1000); - }, []); - - return ( - <> -
- -

Thank you for joining us!

-
- - ); -}; - -export default LogOutStep; diff --git a/clients/web/react/src/_components/PrivateRoute.jsx b/clients/web/react/src/_components/PrivateRoute.jsx deleted file mode 100644 index e105dd4..0000000 --- a/clients/web/react/src/_components/PrivateRoute.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import { Route, Redirect } from 'react-router-dom'; - -export const PrivateRoute = ({ component: Component, ...rest }) => ( - ( - localStorage.getItem('user') - ? - : - )} /> -) \ No newline at end of file diff --git a/clients/web/react/src/_components/PrivateRoute.tsx b/clients/web/react/src/_components/PrivateRoute.tsx new file mode 100644 index 0000000..bc9e239 --- /dev/null +++ b/clients/web/react/src/_components/PrivateRoute.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { Route, Redirect } from "react-router-dom"; + +const PrivateRoute = ({ component: Component, ...rest }) => ( + + localStorage.getItem("user") ? ( + + ) : ( + + ) + } + /> +); + +export { PrivateRoute }; diff --git a/clients/web/react/src/_components/PromptSvPinStep.js b/clients/web/react/src/_components/PromptSvPinStep.js deleted file mode 100644 index dc84a23..0000000 --- a/clients/web/react/src/_components/PromptSvPinStep.js +++ /dev/null @@ -1,119 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; -import validate from 'validate.js'; - -import styles from "./component.module.css"; - -const PromptSvPinStep = ({ setForm, formData, navigation }) => { - const [validated, setValidated] = useState(false); - - var constraints = { - pin: { - presence: true, - numericality: { - onlyInteger: true, - greaterThan: -1, - }, - length: { - minimum: 4, - maximum: 16 - } - } - }; - - const [inputs, setInputs] = useState({ - username: localStorage.getItem('username'), - pin: '' - }); - - const [errors, setErrors] = useState({ - pin: '' - }); - - const LogInStep = () => { - navigation.go('LogInStep'); - } - const registerTrustedDeviceStep = () => { - navigation.go('RegisterTrustedDeviceStep'); - } - - const handleChange = (e) => { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - - setValidated(false); - - const result = validate(inputs, constraints); - if (result) { - if (result[name]) { - setErrors(errors => ({ ...errors, [name]: result[name].join(". ") })); - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } - - const handleSubmit = (event) => { - const form = event.currentTarget; - - event.preventDefault(); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - setValidated(true); - - if (isInputValid()) { - registerTrustedDeviceStep(); - } - } - - const isInputValid = () => { - if (validate(inputs, constraints)) { - return false; - } - return true; - } - - return ( - <> -
-

Welcome

- -
-
- - - Server Verified PIN - - - - {errors.pin} - - - -
-
-
-
-
-
Try Another Method
-
- - ); -}; - -export default PromptSvPinStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.tsx b/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.tsx index f1c7aa0..107a1e1 100644 --- a/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.tsx +++ b/clients/web/react/src/_components/RecoveryCodes/RecoveryCodes.tsx @@ -36,7 +36,7 @@ const RecoveryCodes = function ({ credentials }) { return ( <> - +
Recovery Options
diff --git a/clients/web/react/src/_components/RegisterDeviceSuccessStep.js b/clients/web/react/src/_components/RegisterDeviceSuccessStep.js deleted file mode 100644 index 076b959..0000000 --- a/clients/web/react/src/_components/RegisterDeviceSuccessStep.js +++ /dev/null @@ -1,38 +0,0 @@ -import React from "react"; -import { Button, InputGroup, FormControl, } from 'react-bootstrap'; - -import styles from "./component.module.css"; - -const RegisterDeviceSuccessStep = ({ setForm, formData, navigation }) => { - const accountSecurityStep = () => { - navigation.go('AccountSecurityStep'); - } - - return ( - <> -
-

Device Added

- -
-
-
- - - - - - -
-
- -
-
- - ); -}; - -export default RegisterDeviceSuccessStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/RegisterKeySuccessStep.js b/clients/web/react/src/_components/RegisterKeySuccessStep.js deleted file mode 100644 index 3a69809..0000000 --- a/clients/web/react/src/_components/RegisterKeySuccessStep.js +++ /dev/null @@ -1,40 +0,0 @@ -import React from "react"; -import { Button, InputGroup, FormControl, } from 'react-bootstrap'; - -import styles from "./component.module.css"; - -const RegisterKeySuccessStep = ({ setForm, formData, navigation }) => { - - const registerSvPinStep = () => { - navigation.go('RegisterSvPinStep'); - } - - return ( - <> -
-

Security Key Added

- -
-
-
- - - - - - - -
-
- -
-
- - ); -}; - -export default RegisterKeySuccessStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/RegisterSvPinStep.js b/clients/web/react/src/_components/RegisterSvPinStep.js deleted file mode 100644 index 9975922..0000000 --- a/clients/web/react/src/_components/RegisterSvPinStep.js +++ /dev/null @@ -1,135 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; -import validate from 'validate.js'; - -import styles from "./component.module.css"; - -const RegisterSvPinStep = ({ setForm, formData, navigation }) => { - const [validated, setValidated] = useState(false); - - var constraints = { - pin: { - presence: true, - numericality: { - onlyInteger: true, - greaterThan: -1, - }, - length: { - minimum: 4, - maximum: 16 - } - }, - confirmPin: { - equality: "pin" - } - }; - - const [inputs, setInputs] = useState({ - username: localStorage.getItem('username'), - pin: '', - confirmPin: '' - }); - - const [errors, setErrors] = useState({ - pin: '', - confirmPin: '' - }); - - const accountSecurityStep = () => { - navigation.go('AccountSecurityStep'); - } - - const handleChange = (e) => { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - - setValidated(false); - - const result = validate(inputs, constraints); - if (result) { - if (result[name]) { - setErrors(errors => ({ ...errors, [name]: result[name].join(". ") })); - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - } - } - - const handleSubmit = (event) => { - const form = event.currentTarget; - - event.preventDefault(); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - setValidated(true); - - if (isInputValid()) { - accountSecurityStep(); - } - } - - const isInputValid = () => { - if (validate(inputs, constraints)) { - return false; - } - return true; - } - - - return ( - <> -
-

Create your Server-Verified PIN

- -
-
- - - Server Verified PIN - - - - {errors.pin} - - - - - Confirm PIN             - - - - {errors.confirmPin} - - - -
- - ); -}; - -export default RegisterSvPinStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js b/clients/web/react/src/_components/RegisterTrustedDeviceStep.js deleted file mode 100644 index 1868adb..0000000 --- a/clients/web/react/src/_components/RegisterTrustedDeviceStep.js +++ /dev/null @@ -1,49 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import { Button, InputGroup, FormControl, Card } from 'react-bootstrap'; - -import styles from "./component.module.css"; - -const RegisterTrustedDeviceStep = ({ setForm, formData, navigation }) => { - - const setTrustedDevice = (value) => { - localStorage.setItem('trustedDevice', value); - registerDeviceSuccessStep(); - } - - const registerDeviceSuccessStep = () => { - navigation.go('RegisterDeviceSuccessStep'); - } - - const accountSecurityStep = () => { - navigation.go('AccountSecurityStep'); - } - - return ( - <> -
-

Log In Faster on This Device

- -
-
-
- -
-
- -
-
-
-
-
- Don't want to register this device? -
    -
  • Ask me later
  • -
  • setTrustedDevice(false)} className="btn-link">Never ask me to register this device
  • -
-
-
- - ); -}; - -export default RegisterTrustedDeviceStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/ServerVerifiedPin.jsx b/clients/web/react/src/_components/ServerVerifiedPin.jsx deleted file mode 100644 index 53a49d6..0000000 --- a/clients/web/react/src/_components/ServerVerifiedPin.jsx +++ /dev/null @@ -1,225 +0,0 @@ -import React, { useState, useEffect, useRef, Profiler } from 'react'; -import { Button, Modal, Form, Alert, Row, Col } from 'react-bootstrap'; -import validate from 'validate.js'; - -export function ServerVerifiedPin(props) { - // props.type: "create" | "change" | "dispatch" [default] - // props.saveCallback: method to call on save, passes fields as the argument - // props.showSelector: if defined then show sv-pin modal - - const [show, setShow] = useState(false); - const [fields, handleFieldChange] = useState({ - pin: "", - confirmPin: "", - }); - const [invalidPin, setInvalidPin] = useState(undefined); - const [invalidConfirmPin, setInvalidConfirmPin] = useState(undefined); - const inputRef = useRef(null); - const inputRefNext = useRef(null); - const [uVSubmitted, setUvSubmitted] = useState(false); - const [label, setLabel] = useState({ - header: "", - button: "", - modalHeader: "", - modalPin: "", - modalConfirmPin: "", - modalSaveButton: "" - }); - const [showConfirmPin, setShowConfirmPin] = useState(true); - const [showButton, setShowButton] = useState(false); - var constraints = { - pin: { - presence: true, - numericality: { - onlyInteger: true, - greaterThan: -1, - }, - length: { - minimum: 4, - maximum: 16 - } - }, - confirmPin: { - equality: "pin" - } - }; - - - useEffect(() => { - configureModal(props.type); - }, []); - - useEffect(() => { - if(show) { - inputRef.current.focus(); - } - }, [show]); - - useEffect(() => { - if(props.showSelector !== undefined) { - console.log("showing sv-pin: ", props.showSelector); - handleShow(); - } - }, [props.showSelector]); - - const configureModal = (type) => { - switch (type) { - case "create": - setLabel({ - header: "Server-Verified PIN", - button: "Server-Verified PIN", - modalHeader: "Server-Verified PIN", - modalPin: "Please create a server-verified PIN", - modalConfirmPin: "Confirm PIN", - modalSaveButton: "OK" - }); - setShowConfirmPin(true); - setShowButton(false); - break; - case "change": - setLabel({ - header: "Server-Verified PIN", - button: "Change server-verified PIN", - modalHeader: "Change your Server-Verified PIN", - modalPin: "New PIN", - modalConfirmPin: "Confirm PIN", - modalSaveButton: "Save Changes" - }); - setShowConfirmPin(true); - setShowButton(true); - break; - case "dispatch": - default: - setLabel({ - header: "Server-Verified PIN", - button: "Server-Verified PIN", - modalHeader: "Enter Server-Verified PIN", - modalPin: "PIN", - modalConfirmPin: "", - modalSaveButton: "OK" - }); - setShowConfirmPin(false); - setShowButton(false); - } - return type; - } - - const handleClose = () => { - setShow(false); - setUvSubmitted(false); - } - - const handleCancel = () => { - setShow(false); - setUvSubmitted(false); - } - - const handleSave = () => { - setUvSubmitted(true); - if(validForm(fields.pin, setInvalidPin, fields.confirmPin, setInvalidConfirmPin)) { - props.saveCallback(fields); - setShow(false); - } else { - //do nothing - } - } - - const handleShow = () => { - setUvSubmitted(false); - setShow(true); - } - - function handleChange(e) { - const { name, value } = e.target; - handleFieldChange(fields => ({ ...fields, [name]: value })); - if (name === "pin") { - validForm(value, setInvalidPin, fields.confirmPin, setInvalidConfirmPin); - } else if(name === "confirmPin") { - validForm(fields.pin, setInvalidPin, value, setInvalidConfirmPin); - } - } - - const validForm = (pin, pinCallback, confirmPin, confirmPinCallback) => { - const pinResult = validate({pin: pin}, constraints); - if(pinResult){ - pinCallback(pinResult.pin.join(". ")); - } else { - pinCallback(undefined); - } - - if(showConfirmPin) { - const confirmPinResult = validate({pin: confirmPin}, constraints); - if(confirmPinResult){ - confirmPinCallback(confirmPinResult.pin.join(". ")); - } else { - confirmPinCallback(undefined); - } - - const equalityResult = validate({pin: pin, confirmPin: confirmPin}, constraints); - if(equalityResult) { - if (!confirmPinResult) { - confirmPinCallback(equalityResult.confirmPin.join(". ")); - } - } - - return ( !pinResult && !confirmPinResult && !equalityResult ); - } else { - return !pinResult; - } - } - - return ( - <> - {showButton ? - <> -

{label.header}

- -

- - : null} - - - {label.modalHeader} - -
- - - { - if (ev.key === 'Enter') { - if(showConfirmPin) { - inputRefNext.current.focus(); - } else { - handleSave(); - } - ev.preventDefault(); - } - }}/> - { invalidPin ? {invalidPin} : null } - {showConfirmPin ? - <> - - { - if (ev.key === 'Enter') { - handleSave(); - ev.preventDefault(); - } - }}/> - { invalidConfirmPin ? {invalidConfirmPin} : null } - - : null} - - - - - -
-
- - ); -} diff --git a/clients/web/react/src/_components/SignUpStep.js b/clients/web/react/src/_components/SignUpStep.js deleted file mode 100644 index 4e2fab3..0000000 --- a/clients/web/react/src/_components/SignUpStep.js +++ /dev/null @@ -1,126 +0,0 @@ -import React, { useState, useEffect, useContext } from 'react'; -import { Button, InputGroup, FormControl, Form } from 'react-bootstrap'; -import validate from 'validate.js'; - -import styles from "./component.module.css"; - -const SignUpStep = ({ setForm, formData, navigation }) => { - - const [inputs, setInputs] = useState({ - username: localStorage.getItem('username') - }); - const [errors, setErrors] = useState({ - username: '' - }); - const [validated, setValidated] = useState(false); - - const constraints = { - username: { - presence: true, - format: { - pattern: "[a-z0-9_\-]+", - flags: "i", - message: "can only contain a-z, 0-9, or _-" - }, - length: { - minimum: 3, - maximum: 20 - } - } - }; - - const LogInStep = (step) => { - navigation.go('LogInStep'); - } - const registerKeySuccessStep = (step) => { - navigation.go('RegisterKeySuccessStep'); - } - - const handleChange = (e) => { - const { name, value } = e.target; - setInputs(inputs => ({ ...inputs, [name]: value })); - - const result = validate({ username: value }, constraints); - if (result) { - setErrors(errors => ({ ...errors, [name]: result.username.join(". ") })); - setValidated(false); - return; - } else { - setErrors(errors => ({ ...errors, [name]: undefined })); - setValidated(true); - } - } - - const handleSubmit = (event) => { - const form = event.currentTarget; - - event.preventDefault(); - - setValidated(true); - - if (form.checkValidity() === false) { - event.stopPropagation(); - } - - if(isUsernameValid()) { - registerKeySuccessStep(); - } - } - - const isUsernameValid = () => { - if(validate({ username: inputs.username }, constraints)){ - return false; - } - return true; -} - - return ( - <> -
-

Welcome

- -
-
- - - - @ - - - - {errors.username} - - - -
-

Add Your Security Key

- -
-
    -
  1. Make sure your Security Key is nearby
  2. -
  3. Follow the steps in the browser
  4. -
  5. Give your Security Key a nickname to easily identify it later
  6. -
- -
-
-
-
-
-
Already have an account? Log In
-
- - ); -}; - -export default SignUpStep; \ No newline at end of file diff --git a/clients/web/react/src/_components/UserVerificationClient.js b/clients/web/react/src/_components/UserVerificationClient.js deleted file mode 100644 index f83d1a6..0000000 --- a/clients/web/react/src/_components/UserVerificationClient.js +++ /dev/null @@ -1,53 +0,0 @@ -import React, { useState, useEffect, useRef, Profiler } from 'react'; -import { Button, Modal, Form, Alert, Row, Col } from 'react-bootstrap'; -import validate from 'validate.js'; - -export function UserVerificationClient(props) { - const cognitoUser = props.cognitoUser; - const finishUVRequest = useSelector(state => state.credentials.finishUVRequest); - const svpinDispatchProps = { type: "dispatch", saveCallback: finishUVResponse, showSelector: finishUVRequest }; - - - function finishUVResponse(fields) { - let challengeResponse = finishUVRequest; - console.log("sending authenticator response with sv-pin: ", challengeResponse); - challengeResponse.pinCode = parseInt(fields.pin); - - Auth.sendCustomChallengeAnswer(cognitoUser, JSON.stringify(challengeResponse)) - .then(user => { - console.log("uv sendCustomChallengeAnswer: ", user); - - Auth.currentSession() - .then(data => { - dispatch(alertActions.success('Authentication successful')); - let userData = { - id: 1, - username: user.attributes.name, - token: data.getAccessToken().getJwtToken() - } - localStorage.setItem('user', JSON.stringify(userData)); - console.log("userData ", localStorage.getItem('user')); - history.push('/'); - }) - .catch(err => { - console.log("currentSession error: ", err); - dispatch(alertActions.error("Something went wrong. ", err.message)); - setContinueSubmitted(false); - }); - - }) - .catch(err => { - console.log("sendCustomChallengeAnswer error: ", err); - let message = "Invalid PIN"; - dispatch(alertActions.error(message)); - setContinueSubmitted(false); - }); - dispatch(credentialActions.completeUV()); - } - - return ( - <> - - - ); -} \ No newline at end of file diff --git a/clients/web/react/src/_components/WebAuthnClient.js b/clients/web/react/src/_components/WebAuthnClient.ts similarity index 93% rename from clients/web/react/src/_components/WebAuthnClient.js rename to clients/web/react/src/_components/WebAuthnClient.ts index 7ee978f..30795ec 100644 --- a/clients/web/react/src/_components/WebAuthnClient.js +++ b/clients/web/react/src/_components/WebAuthnClient.ts @@ -8,29 +8,34 @@ import aws_exports from "../aws-exports"; axios.defaults.baseURL = aws_exports.apiEndpoint; -export const WebAuthnClient = { +const WebAuthnClient = { getAuthChallegeResponse, getPublicKeyRequestOptions, - getUsernamelessAuthChallegeResponse, + //getUsernamelessAuthChallegeResponse, getUVFromAssertion, sendChallengeAnswer, signIn, signUp, }; -const defaultInvalidPIN = -1; +const defaultInvalidPIN = "-1"; const webAuthnClientExceptionName = "WebAuthnClientException"; const ERROR_CODE = "ERROR_CODE"; const INVALID_CHALLENGE_TYPE = "INVALID_CHALLENGE_TYPE"; function WebAuthnClientException(message, code = ERROR_CODE) { const error = new Error(message); - error.code = code; - error.name = webAuthnClientExceptionName; - return error; + const formattedError = { + ...error, + code: code, + name: webAuthnClientExceptionName, + }; + //error.code = code; + //error.name = webAuthnClientExceptionName; + return formattedError; } -async function getPublicKeyRequestOptions() { +async function getPublicKeyRequestOptions(): Promise { try { const response = await axios.get("/users/credentials/fido2/authenticate"); console.log( @@ -44,9 +49,10 @@ async function getPublicKeyRequestOptions() { } } +/* async function getUsernamelessAuthChallegeResponse() { try { - const requestOptions = getPublicKeyRequestOptions(); + const requestOptions = await getPublicKeyRequestOptions(); const publicKey = { publicKey: requestOptions.publicKeyCredentialRequestOptions, @@ -87,6 +93,7 @@ async function getUsernamelessAuthChallegeResponse() { throw error; } } +*/ async function getAuthChallegeResponse(cognitoChallenge) { try { @@ -220,8 +227,8 @@ async function signIn(name, requestUV) { if (name === undefined) { console.log("WebAuthnClient signIn() usernameless flow"); - challengeResponse, - (username = await getUsernamelessAuthChallegeResponse()); + //challengeResponse, + //(username = await getUsernamelessAuthChallegeResponse()); } else { console.log("WebAuthnClient signIn() username flow"); username = name.toLocaleLowerCase(); @@ -235,7 +242,7 @@ async function signIn(name, requestUV) { cognitoUser.challengeName === "CUSTOM_CHALLENGE" && cognitoUser.challengeParam.type === "webauthn.create" ) { - throw new WebAuthnClientException( + throw WebAuthnClientException( "User not found. Please Sign Up.", INVALID_CHALLENGE_TYPE ); @@ -281,7 +288,7 @@ async function signIn(name, requestUV) { console.error( "WebAuthnClient signIn() error: throw WebAuthnClientException" ); - throw new WebAuthnClientException("Invalid server response"); + throw WebAuthnClientException("Invalid server response"); } } catch (error) { console.error("WebAuthnClient signIn() error: ", error); @@ -363,7 +370,7 @@ async function signUp(name, requestUV) { cognitoUser.challengeName === "CUSTOM_CHALLENGE" && cognitoUser.challengeParam.type === "webauthn.get" ) { - throw new WebAuthnClientException( + throw WebAuthnClientException( "User already exists. Please Sign In.", INVALID_CHALLENGE_TYPE ); @@ -403,10 +410,12 @@ async function signUp(name, requestUV) { console.error( "WebAuthnClient signUp() error: throw WebAuthnClientException" ); - throw new WebAuthnClientException("Invalid server response"); + throw WebAuthnClientException("Invalid server response"); } } catch (error) { console.error("WebAuthnClient signUp() error: ", error); throw error; } } + +export { WebAuthnClient }; diff --git a/clients/web/react/src/_components/index.js b/clients/web/react/src/_components/index.js index 9a43a37..fb3c2c3 100644 --- a/clients/web/react/src/_components/index.js +++ b/clients/web/react/src/_components/index.js @@ -1,4 +1,2 @@ -export * from './PrivateRoute'; -export * from './ServerVerifiedPin'; -export * from './IdentifierFirstFlow'; -export * from './WebAuthnClient'; \ No newline at end of file +export { PrivateRoute } from './PrivateRoute'; +export { WebAuthnClient } from './WebAuthnClient'; \ No newline at end of file From 7fa91fca972f523d668831b9fbcff12947c2098c Mon Sep 17 00:00:00 2001 From: csalas Date: Fri, 17 Dec 2021 11:41:24 -0600 Subject: [PATCH 42/66] Added loading animations to login, register --- clients/web/react/src/LoginPage/LogInStep.tsx | 28 +++++++++----- .../web/react/src/RegisterPage/SignUpStep.tsx | 37 +++++++++++++++++-- .../src/_components/component.module.css | 4 ++ 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/clients/web/react/src/LoginPage/LogInStep.tsx b/clients/web/react/src/LoginPage/LogInStep.tsx index 5c3e962..13cd05c 100644 --- a/clients/web/react/src/LoginPage/LogInStep.tsx +++ b/clients/web/react/src/LoginPage/LogInStep.tsx @@ -100,11 +100,15 @@ const LogInStep = function ({ navigation }) { dispatch(alertActions.success("Login Successful")); localStorage.setItem("credential", JSON.stringify(userData.credential)); console.log("LogInStep Successful credential ", userData.credential); + registerTrustedDeviceOrContinue("/"); } } catch (error) { console.log("LoginStep signin error"); console.log(error); dispatch(alertActions.error(error.message)); + if (error.code === "UserNotFoundException") { + signUpStep(); + } } } @@ -182,8 +186,9 @@ const LogInStep = function ({ navigation }) { if (isUsernameValid()) { setValidated(true); if (inputs.continue === true) { + setContinueSubmitted(true); await signIn(inputs.username); - registerTrustedDeviceOrContinue("/"); + setContinueSubmitted(false); } else if (inputs.forgotStep === true) { localStorage.setItem("username", inputs.username); forgotStep(); @@ -237,15 +242,20 @@ const LogInStep = function ({ navigation }) { block disabled={continueSubmitted}> {continueSubmitted && ( -
- {serverVerifiedPin} + {u2fPassword} ); }; diff --git a/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.tsx b/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.tsx index 8483c11..e5eb3e8 100644 --- a/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.tsx +++ b/clients/web/react/src/LoginPage/LogInTrustedDeviceStep.tsx @@ -60,21 +60,56 @@ const LogInTrustedDeviceStep = function ({ navigation }) { * Call to the get() api to get the credentials based on the public key value in the starter response */ async function signInWithoutUsername() { - console.log("signInWithoutUsername"); + console.info( + t("console.info", { + COMPONENT: "LoginTrustedDeviceStep", + METHOD: "signInWithoutUsername()", + LOG_REASON: t("console.reason.loginTrustedDevice0"), + }) + ); + // get usernameless auth request - console.log("webAuthnStartResponse: ", webAuthnStartResponse); + console.info( + t("console.info", { + COMPONENT: "LoginTrustedDeviceStep", + METHOD: "signInWithoutUsername()", + LOG_REASON: t("console.reason.loginTrustedDevice1"), + }), + webAuthnStartResponse + ); const publicKey = { publicKey: webAuthnStartResponse.publicKeyCredentialRequestOptions, }; - console.log("publicKey: ", publicKey); + console.info( + t("console.info", { + COMPONENT: "LoginTrustedDeviceStep", + METHOD: "signInWithoutUsername()", + LOG_REASON: t("console.reason.loginTrustedDevice2"), + }), + publicKey + ); const assertionResponse = await get(publicKey); - console.log("assertionResponse: ", assertionResponse); + console.info( + t("console.info", { + COMPONENT: "LoginTrustedDeviceStep", + METHOD: "signInWithoutUsername()", + LOG_REASON: t("console.reason.loginTrustedDevice3"), + }), + assertionResponse + ); // get username from assertionResponse const username = assertionResponse.response.userHandle; - console.log("userhandle: ", username); + console.info( + t("console.info", { + COMPONENT: "LoginTrustedDeviceStep", + METHOD: "signInWithoutUsername()", + LOG_REASON: t("console.reason.loginTrustedDevice4"), + }), + username + ); const challengeResponse = { credential: assertionResponse, @@ -89,33 +124,51 @@ const LogInTrustedDeviceStep = function ({ navigation }) { user.challengeName === "CUSTOM_CHALLENGE" && user.challengeParam.type === "webauthn.create" ) { - dispatch(alertActions.error("Please register an account")); + dispatch(alertActions.error(t("alerts.register-account"))); history.push("/register"); } else if ( user.challengeName === "CUSTOM_CHALLENGE" && user.challengeParam.type === "webauthn.get" ) { // to send the answer of the custom challenge - console.log("uv sending Custom Challenge Answer"); + console.info( + t("console.info", { + COMPONENT: "LoginTrustedDeviceStep", + METHOD: "signInWithoutUsername()", + LOG_REASON: t("console.reason.loginTrustedDevice5"), + }) + ); Auth.sendCustomChallengeAnswer( user, JSON.stringify(challengeResponse) ) .then((user) => { - console.log("someUser Stuff", user); navigation.go("InitUserStep"); }) .catch((err) => { - console.error("sendCustomChallengeAnswer error: ", err); + console.error( + t("console.error", { + COMPONENT: "LoginTrustedDeviceStep", + METHOD: "signInWithoutUsername()", + REASON: t("console.reason.loginTrustedDevice6"), + }), + err + ); dispatch(alertActions.error(err.message)); }); } else { - dispatch(alertActions.error("Invalid server response")); + dispatch(alertActions.error(t("alerts.invalid-server-response"))); } }) .catch((error) => { - console.error("signIn error"); - console.error(error); + console.error( + t("console.error", { + COMPONENT: "LoginTrustedDeviceStep", + METHOD: "signInWithoutUsername()", + REASON: t("console.reason.loginTrustedDevice7"), + }), + error + ); dispatch(alertActions.error(error.message)); setContinueSubmitted(false); }); diff --git a/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.tsx b/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.tsx index bc616f7..8330e1e 100644 --- a/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.tsx +++ b/clients/web/react/src/LoginPage/RegisterTrustedDeviceStep.tsx @@ -49,22 +49,39 @@ const RegisterTrustedDeviceStep = function ({ navigation }) { * Otherwise send an error and instruct the user to add their device */ async function authenticate() { - console.log("authenticate"); + console.info( + t("console.info", { + COMPONENT: "RegisterTrustedDeviceStep", + METHOD: "authenticate()", + LOG_REASON: t("console.reason.registerTrustedDeviceStep0"), + }) + ); setContinueSubmitted(true); const username = localStorage.getItem("username"); try { const options = ""; const userData = await WebAuthnClient.signIn(username, options); - console.log("RegisterTrustedDevice authenticate userData: ", userData); + console.info( + t("console.info", { + COMPONENT: "RegisterTrustedDeviceStep", + METHOD: "authenticate()", + LOG_REASON: t("console.reason.registerTrustedDeviceStep1"), + }), + userData + ); if (userData === undefined) { console.error( - "RegisterTrustedDeviceStep authenticate error: userData undefined" + t("console.error", { + COMPONENT: "RegisterTrustedDeviceStep", + METHOD: "authenticate()", + REASON: t("console.reason.registerTrustedDeviceStep2"), + }) ); - dispatch(alertActions.error("Something went wrong. Please try again.")); + dispatch(alertActions.error(t("alerts.something-went-wrong"))); setContinueSubmitted(false); } else { - dispatch(alertActions.success("Authentication successful")); + dispatch(alertActions.success(t("alerts.auth-successful"))); TrustedDeviceHelper.setTrustedDevice( TrustedDeviceHelper.TrustedDeviceEnum.CONFIRMED, userData.credential.id @@ -72,7 +89,13 @@ const RegisterTrustedDeviceStep = function ({ navigation }) { continueStep(); } } catch (err) { - console.error("RegisterTrustedDeviceStep authenticate error"); + console.error( + t("console.error", { + COMPONENT: "RegisterTrustedDeviceStep", + METHOD: "authenticate()", + REASON: t("console.reason.registerTrustedDeviceStep3"), + }) + ); setContinueSubmitted(false); dispatch(alertActions.error(err.message)); } diff --git a/clients/web/react/src/LogoutPage/LogoutPage.tsx b/clients/web/react/src/LogoutPage/LogoutPage.tsx index 8626d83..531a08f 100644 --- a/clients/web/react/src/LogoutPage/LogoutPage.tsx +++ b/clients/web/react/src/LogoutPage/LogoutPage.tsx @@ -22,7 +22,14 @@ const LogoutPage = function () { history.push("/"); setTimeout(() => window.location.reload(), 100); } catch (err) { - console.error("There was an error signing out the user: ", err); + console.error( + t("console.error", { + COMPONENT: "LogoutPage", + METHOD: "logoutUser", + REASON: t("console.reason.logout0"), + }), + err + ); } }; diff --git a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.tsx b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.tsx index 39280af..dfe4306 100644 --- a/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.tsx +++ b/clients/web/react/src/RegisterPage/RegisterKeySuccessStep.tsx @@ -42,14 +42,22 @@ const RegisterKeySuccessStep = function ({ setForm, formData, navigation }) { const { username, pin, nickname, credential } = formData; async function updateCredential(nickname) { - console.log( - "RegisterKeySuccessStep updateCredential() nickname:", + console.info( + t("console.info", { + COMPONENT: "RegisterKeySuccessStep", + METHOD: "updateCredential()", + LOG_REASON: t("console.reason.registerKeySuccessStep0"), + }), nickname ); try { const ls_credential = JSON.parse(localStorage.getItem("credential")); - console.log( - "RegisterKeySuccessStep updateCredential() ls_credential:", + console.info( + t("console.info", { + COMPONENT: "RegisterKeySuccessStep", + METHOD: "updateCredential()", + LOG_REASON: t("console.reason.registerKeySuccessStep1"), + }), ls_credential ); @@ -66,8 +74,14 @@ const RegisterKeySuccessStep = function ({ setForm, formData, navigation }) { dispatch(credentialActions.update(credentialToUpdate)); } catch (err) { - console.error("RegisterKeySuccessStep continueStep() error"); - console.error(err); + console.error( + t("console.error", { + COMPONENT: "RegisterKeySuccessStep", + METHOD: "continueStep()", + REASON: t("console.reason.registerKeySuccessStep2"), + }), + err + ); dispatch(alertActions.error(err.message)); } localStorage.removeItem("credential"); diff --git a/clients/web/react/src/RegisterPage/SignUpStep.tsx b/clients/web/react/src/RegisterPage/SignUpStep.tsx index f180855..b533444 100644 --- a/clients/web/react/src/RegisterPage/SignUpStep.tsx +++ b/clients/web/react/src/RegisterPage/SignUpStep.tsx @@ -14,7 +14,7 @@ import { useTranslation } from "react-i18next"; import { history } from "../_helpers"; import { WebAuthnClient } from "../_components"; import { credentialActions, alertActions } from "../_actions"; -import ServerVerifiedPin from "../_components/ServerVerifiedPin/ServerVerifiedPin"; +import U2FPassword from "../_components/u2fPassword/u2fPassword"; import HandleWebKit from "../_components/HandleWebkit/HandleWebkit"; const styles = require("../_components/component.module.css"); @@ -31,7 +31,7 @@ const SignUpStep = function ({ setForm, formData, navigation }) { const dispatch = useDispatch(); - const [serverVerifiedPin, setServerVerifiedPin] = useState(); + const [u2fPassword, setu2fPassword] = useState(); const [handleWebKit, setHandleWebKit] = useState(); @@ -75,24 +75,49 @@ const SignUpStep = function ({ setForm, formData, navigation }) { * Primary logic of the register step */ async function register() { - console.log("register"); + console.info( + t("console.info", { + COMPONENT: "SignUpStep", + METHOD: "register", + LOG_REASON: t("console.reason.signUp0"), + }) + ); try { const userData = await WebAuthnClient.signUp(username, uv, webKitMethod); - console.log("SignUpStep register userData: ", userData); + console.info( + t("console.info", { + COMPONENT: "SignUpStep", + METHOD: "register", + LOG_REASON: t("console.reason.signUp1"), + }), + userData + ); if (userData === undefined) { - console.error("SignUpStep register error: userData undefined"); - dispatch(alertActions.error("Something went wrong. Please try again.")); + console.error( + t("console.error", { + COMPONENT: "SignUpStep", + METHOD: "register", + REASON: t("console.reason.signUp2"), + }) + ); + dispatch(alertActions.error(t("alerts.something-went-wrong"))); } else { - dispatch(alertActions.success("Registration successful")); + dispatch(alertActions.success(t("alerts.registration-successful"))); setForm({ target: { name: "credential", value: userData.credential } }); registerKeySuccessStep(userData.credential); navigation.go("InitUserStep"); } } catch (err) { - console.error("SignUpStep register error"); - console.error(err); + console.error( + t("console.error", { + COMPONENT: "SignUpStep", + METHOD: "register", + REASON: t("console.reason.signUp3"), + }), + err + ); setContinueSubmitted(false); dispatch(alertActions.error(err.message)); setHandleWebKit(null); @@ -100,34 +125,32 @@ const SignUpStep = function ({ setForm, formData, navigation }) { } /** - * If the key is a U2F key, then a SVPIN needs to be configured on key registration - * This promise allows the ServerVerifiedPIN to be initialized by the WebAuthN component through a promise - * This Step will configure the ServerVerifiedPIN components properties, and await for a Save response to be sent from the component - * @returns A promise containing the PIN to be used for registration in the WebAuthN component + * If the key is a U2F key, then a U2F Password needs to be configured on key registration + * This promise allows the U2F Password to be initialized by the WebAuthn component through a promise + * This Step will configure the U2F Password components properties, and await for a Save response to be sent from the component + * @returns A promise containing the U2F Password to be used for registration in the WebAuthN component */ const UVPromise = (): Promise<{ value: number }> => { return new Promise((resolve, reject) => { - const svpinCreateProps = { + const u2fPassCreateProps = { type: "create", saveCallback: resolve, closeCallback: reject, }; - console.log("SignUpStep UVPromise(): ", svpinCreateProps); - setServerVerifiedPin(); + setu2fPassword(); }); }; /** - * If the key is a U2F key, then a SVPIN needs to be configured on key registration - * This promise allows the ServerVerifiedPIN to be initialized by the WebAuthN component through a promise - * This Step will configure the ServerVerifiedPIN components properties, and await for a Save response to be sent from the component - * @param challengeResponse sent from WebAuthN component that is used to dispatch the event to start PIN registration - * @returns A promise containing the PIN to be used for registration in the WebAuthN component + * If the key is a U2F key, then a U2F Password needs to be configured on key registration + * This promise allows the U2F Password to be initialized by the WebAuthn component through a promise + * This Step will configure the U2F Password components properties, and await for a Save response to be sent from the component + * @param challengeResponse sent from WebAuthN component that is used to dispatch the event to start U2F Password registration + * @returns A promise containing the U2F Password to be used for registration in the WebAuthN component */ async function uv(challengeResponse) { dispatch(credentialActions.getUV(challengeResponse)); const pinResult = await UVPromise(); - console.log("SignUpStep PIN Result: ", pinResult.value); return pinResult.value; } @@ -150,7 +173,6 @@ const SignUpStep = function ({ setForm, formData, navigation }) { saveCallback: resolve, closeCallback: reject, }; - console.log("SignUpStep WebKitPromise(): ", handleWebKitProps); setHandleWebKit(); }); }; @@ -165,7 +187,6 @@ const SignUpStep = function ({ setForm, formData, navigation }) { */ async function webKitMethod(type, publicKey) { const attestationResponse = await WebKitPromise(type, publicKey); - console.log("SignUpStep webKitMethod Result: ", attestationResponse); return attestationResponse; } @@ -175,7 +196,14 @@ const SignUpStep = function ({ setForm, formData, navigation }) { */ const registerKeySuccessStep = (userCredential) => { localStorage.setItem("credential", JSON.stringify(userCredential)); - console.log("registerKeySuccessStep credential ", userCredential); + console.info( + t("console.info", { + COMPONENT: "SignUpStep", + METHOD: "registerKeySuccessStep", + REASON: t("console.reason.signUp4"), + }), + userCredential + ); }; /** @@ -306,7 +334,7 @@ const SignUpStep = function ({ setForm, formData, navigation }) { - {serverVerifiedPin} + {u2fPassword} {handleWebKit} ); diff --git a/clients/web/react/src/_actions/credential.actions.ts b/clients/web/react/src/_actions/credential.actions.ts index 3c7a846..1d9b137 100644 --- a/clients/web/react/src/_actions/credential.actions.ts +++ b/clients/web/react/src/_actions/credential.actions.ts @@ -1,4 +1,5 @@ import validate from "validate.js"; +import { i18n } from "../i18n"; import { credentialConstants } from "../_constants"; import credentialService from "../_services/credential.service"; import { alertActions } from "."; @@ -25,6 +26,8 @@ const constraints = { }, }; +const { t } = i18n; + function generateRecoveryCodes() { return (dispatch) => { dispatch(request()); @@ -111,7 +114,7 @@ function updatePin(fields) { credentialService.updatePin(fields).then( (response) => { dispatch(success(response)); - dispatch(alertActions.success("Update successful")); + dispatch(alertActions.success(t("alerts.update-successful"))); }, (error) => { dispatch(failure(error.toString())); @@ -163,16 +166,20 @@ function registerFinish(registration) { credentialService.registerFinish(registration).then( (registration) => { - console.log( - "credential.actions registerFinish registration: ", + console.info( + t("console.info", { + COMPONENT: "credential.actions", + METHOD: "registerFinish()", + LOG_REASON: "registration", + }), registration ); if (registration === undefined) { - dispatch(failure("Registration failed")); - dispatch(alertActions.error("Registration failed")); + dispatch(failure(t("alerts.registration-failed"))); + dispatch(alertActions.error(t("alerts.registration-failed"))); } else { dispatch(success(registration)); - dispatch(alertActions.success("Registration successful")); + dispatch(alertActions.success(t("alerts.registration-successful"))); } }, (error) => { @@ -217,12 +224,6 @@ function getAll(id) { function getUV(uvRequest) { return (dispatch) => { dispatch(request(uvRequest)); - - /* credentialService.getAll(id) - .then( - credentials => dispatch(success(credentials)), - error => dispatch(failure(error.toString())) - ); */ }; function request(uvRequest) { @@ -235,12 +236,6 @@ function getUV(uvRequest) { function completeUV() { return (dispatch) => { dispatch(success()); - - /* credentialService.getAll(id) - .then( - credentials => dispatch(success(credentials)), - error => dispatch(failure(error.toString())) - ); */ }; // function request(uvRequest) { return { type: credentialConstants.GETUV_REQUEST, uvRequest } } @@ -258,7 +253,7 @@ function _delete(id) { credentialService.delete(id).then( (credentials) => { dispatch(success(id)); - dispatch(alertActions.success("Delete credential successful")); + dispatch(alertActions.success(t("alerts.delete-successful"))); }, (error) => { dispatch(failure(id, error.toString())); diff --git a/clients/web/react/src/_components/Credential/AddCredential.tsx b/clients/web/react/src/_components/Credential/AddCredential.tsx index 4d34eed..af46a0b 100644 --- a/clients/web/react/src/_components/Credential/AddCredential.tsx +++ b/clients/web/react/src/_components/Credential/AddCredential.tsx @@ -6,7 +6,7 @@ import validate from "validate.js"; import { useDispatch } from "react-redux"; import { useTranslation } from "react-i18next"; import { credentialActions, alertActions } from "../../_actions"; -import ServerVerifiedPin from "../ServerVerifiedPin/ServerVerifiedPin"; +import U2FPassword from "../u2fPassword/u2fPassword"; import AddCredentialGuidance from "./AddCredentialGuidance"; // eslint-disable-next-line camelcase import aws_exports from "../../aws-exports"; @@ -25,8 +25,8 @@ const AddCredential = function () { const [showAdd, setShowAdd] = useState(false); - // Will load the SVPIN component if the new credential is non-FIDO2 - const [serverVerifiedPin, setServerVerifiedPin] = useState(); + // Will load the U2F Password component if the new credential is non-FIDO2 + const [u2fPassword, setu2fPassword] = useState(); const [nickname, setNickname] = useState(""); @@ -79,7 +79,14 @@ const AddCredential = function () { try { await register(); } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "AddCredential", + METHOD: "handleSaveAdd()", + REASON: t("console.reason.addCredential0"), + }), + error + ); setLoading(false); } } @@ -96,29 +103,29 @@ const AddCredential = function () { }; /** - * If the key is a U2F key, then a SVPIN needs to be configured on key registration - * This promise allows the ServerVerifiedPIN to be initialized by the WebAuthN component through a promise - * This Step will configure the ServerVerifiedPIN components properties, and await for a Save response to be sent from the component - * @param challengeResponse sent from WebAuthN component that is used to dispatch the event to start PIN registration - * @returns A promise containing the PIN to be used for registration in the WebAuthN component + * If the key is a U2F key, then a U2F Password needs to be configured on key registration + * This promise allows the a U2F Password to be initialized by the WebAuthn component through a promise + * This Step will configure the a U2F Password components properties, and await for a Save response to be sent from the component + * @param challengeResponse sent from WebAuthn component that is used to dispatch the event to start U2F Password registration + * @returns A promise containing the U2F Password to be used for registration in the WebAuthn component */ const UVPromise = (): Promise<{ value: number }> => { return new Promise((resolve, reject) => { - const svpinCreateProps = { + const u2fPassCreateProps = { type: "create", saveCallback: resolve, closeCallback: reject, }; - setServerVerifiedPin(); + setu2fPassword(); }); }; /** - * If the key is a U2F key, then a SVPIN needs to be configured on key registration - * This promise allows the ServerVerifiedPIN to be initialized by the WebAuthN component through a promise - * This Step will configure the ServerVerifiedPIN components properties, and await for a Save response to be sent from the component - * @param challengeResponse sent from WebAuthN component that is used to dispatch the event to start PIN registration - * @returns A promise containing the PIN to be used for registration in the WebAuthN component + * If the key is a U2F key, then a U2F Password needs to be configured on key registration + * This promise allows the U2F Password to be initialized by the WebAuthn component through a promise + * This Step will configure the U2F Password components properties, and await for a Save response to be sent from the component + * @param challengeResponse sent from WebAuthN component that is used to dispatch the event to start U2F Password registration + * @returns A promise containing the U2F Password to be used for registration in the WebAuthN component */ async function registerUV(challengeResponse) { dispatch(credentialActions.getUV(challengeResponse)); @@ -133,10 +140,12 @@ const AddCredential = function () { * Current state will only allow for roaming authenticators */ const register = async () => { - console.log("Beginning key registration process"); - console.log("register() nickname: ", nickname); - try { + /** + * CROSS_PLATFORM specified as the authenticator attachment to force + * credential creation to use a roaming authenticator + * More information can be found here: https://www.w3.org/TR/webauthn-2/#enum-attachment + */ await WebAuthnClient.registerNewCredential( nickname, isResidentKey, @@ -247,7 +256,7 @@ const AddCredential = function () { - {serverVerifiedPin} + {u2fPassword} ); }; diff --git a/clients/web/react/src/_components/Credential/EditCredential.tsx b/clients/web/react/src/_components/Credential/EditCredential.tsx index e010b1b..05558c3 100644 --- a/clients/web/react/src/_components/Credential/EditCredential.tsx +++ b/clients/web/react/src/_components/Credential/EditCredential.tsx @@ -77,12 +77,8 @@ const EditCredential = function ({ credential }) { const handleChange = (e) => { const { name, value } = e.target; setNickname(value); - - console.log(value); - const result = validate({ nickname: value }, constraints); if (result) { - console.log("Here"); setInvalidNickname(result.nickname.join(". ")); } else { setInvalidNickname(undefined); diff --git a/clients/web/react/src/_components/DeleteUser/DeleteUser.tsx b/clients/web/react/src/_components/DeleteUser/DeleteUser.tsx index 2aa776a..90606c8 100644 --- a/clients/web/react/src/_components/DeleteUser/DeleteUser.tsx +++ b/clients/web/react/src/_components/DeleteUser/DeleteUser.tsx @@ -56,7 +56,14 @@ const DeleteUser = function ({ userToken }) { }) ) .catch((error) => { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "DeleteUser", + METHOD: "handleDelete()", + REASON: t("console.reason.deleteUser0"), + }), + error + ); dispatch(alertActions.error(error.message)); }); }; diff --git a/clients/web/react/src/_components/HandleWebkit/HandleWebkit.tsx b/clients/web/react/src/_components/HandleWebkit/HandleWebkit.tsx index 577be55..b453b15 100644 --- a/clients/web/react/src/_components/HandleWebkit/HandleWebkit.tsx +++ b/clients/web/react/src/_components/HandleWebkit/HandleWebkit.tsx @@ -35,32 +35,31 @@ const HandleWebKit = function (props) { /** * This method is used to configure the labels on the component depending on the type of UV dispatch that is sent from the parent component * @param {*} type possible values are: - * create: Sent by the registration flow to create a new SVPIN upon initial registration - * change: Sent by the homepage when a user wants to change their SVPIN - * dispatch: Sent by login when a user needs to enter their SVPIN when logging into the service + * create: Sent by the registration flow to create a new U2F Password upon initial registration + * change: Sent by the homepage when a user wants to change their U2F Password + * dispatch: Sent by login when a user needs to enter their U2F Password when logging into the service */ const configureModal = (type) => { switch (type) { case "ios": setLabel({ - modalHeader: "Select your registration method", - modalText: - "Click the button below to register with FaceID or your security key", - modalPlatAuthButton: "FaceID", + modalHeader: t("handle-webkit.modal-header-ios"), + modalText: t("handle-webkit.modal-text-ios"), + modalPlatAuthButton: t("handle-webkit.modal-platauth-button-ios"), }); break; case "macos": setLabel({ - modalHeader: "Select your registration method", - modalText: "Click the button below to register your security key", - modalPlatAuthButton: "TouchID", + modalHeader: t("handle-webkit.modal-header-macos"), + modalText: t("handle-webkit.modal-text-macos"), + modalPlatAuthButton: t("handle-webkit.modal-platauth-button-macos"), }); break; default: setLabel({ - modalHeader: "", - modalText: "", - modalPlatAuthButton: "", + modalHeader: t("handle-webkit.modal-default"), + modalText: t("handle-webkit.modal-default"), + modalPlatAuthButton: t("handle-webkit.modal-default"), }); break; } @@ -70,7 +69,13 @@ const HandleWebKit = function (props) { * Shows the modal */ const handleShow = () => { - console.log(`HandleWebKit Showing Modal`); + console.info( + t("console.info", { + COMPONENT: "HandleWebKit", + METHOD: "handleShow()", + LOG_REASON: t("console.reason.handlewebkit0"), + }) + ); setShow(true); setContinueSubmitted(false); }; @@ -79,11 +84,7 @@ const HandleWebKit = function (props) { * Closes the modal */ const handleClose = () => { - props.closeCallback( - new Error( - "PIN Registration Ended - Please attempt to register your security key" - ) - ); + props.closeCallback(new Error(t("handle-webkit.pin-error"))); setShow(false); setContinueSubmitted(false); }; @@ -95,7 +96,14 @@ const HandleWebKit = function (props) { */ const handleRegistration = async () => { setContinueSubmitted(true); - console.log("HandleWebKit handleSecKey() publicKey: ", props.publicKey); + console.info( + t("console.info", { + COMPONENT: "HandleWebKit", + METHOD: "handleRegistration()", + LOG_REASON: t("console.reason.handlewebkit1"), + }), + props.publicKey + ); try { const attestationResponse = await create(props.publicKey); @@ -104,7 +112,14 @@ const HandleWebKit = function (props) { setContinueSubmitted(false); } catch (error) { setContinueSubmitted(false); - console.error("HandleWebKit handleSecKey() Error: ", error); + console.error( + t("console.error", { + COMPONENT: "HandleWebKit", + METHOD: "handleRegistration()", + REASON: t("console.reason.handlewebkit2"), + }), + error + ); } }; @@ -112,7 +127,13 @@ const HandleWebKit = function (props) { * On initializing this component, shows the modal */ useEffect(() => { - console.log(`HandleWebKit Configuring Props and Showing Modal`); + console.info( + t("console.info", { + COMPONENT: "HandleWebKit", + METHOD: "useEffect()", + LOG_REASON: t("console.reason.handlewebkit3"), + }) + ); configureModal(props.type); handleShow(); }, []); diff --git a/clients/web/react/src/_components/TrustedDevices/AddTrustedDevice.tsx b/clients/web/react/src/_components/TrustedDevices/AddTrustedDevice.tsx index 7c6ef72..883f14a 100644 --- a/clients/web/react/src/_components/TrustedDevices/AddTrustedDevice.tsx +++ b/clients/web/react/src/_components/TrustedDevices/AddTrustedDevice.tsx @@ -89,7 +89,14 @@ const AddTrustedDevice = function ({ continueStep }) { await register(); continueStep(); } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "AddTrustedDevice", + METHOD: "handleSaveAdd()", + REASON: t("console.reason.addTrustedDevice0"), + }), + error + ); setLoading(false); } } @@ -102,10 +109,13 @@ const AddTrustedDevice = function ({ continueStep }) { * Removing requireAuthenticatorAttachment from the register POST will allow any key to be registered */ const register = async () => { - console.log("register"); - console.log("nickname: ", nickname); - try { + /** + * PLATFORM specified as the authenticator attachment to force + * credential creation to use a platform authenticator + * More information can be found here: https://www.w3.org/TR/webauthn-2/#dom-authenticatorselectioncriteria-residentkey + * true required to force discoverable credentials to be created on the platform authenticator, which is required + */ await WebAuthnClient.registerNewCredential( nickname, true, diff --git a/clients/web/react/src/_components/WebAuthnClient.ts b/clients/web/react/src/_components/WebAuthnClient.ts index cc5f8e8..b5cd98f 100644 --- a/clients/web/react/src/_components/WebAuthnClient.ts +++ b/clients/web/react/src/_components/WebAuthnClient.ts @@ -5,6 +5,7 @@ import { Auth } from "aws-amplify"; import axios from "axios"; import credentialService from "../_services/credential.service"; import { TrustedDeviceHelper } from "./TrustedDevices/TrustedDeviceHelper"; +import { i18n } from "../i18n"; import aws_exports from "../aws-exports"; @@ -21,6 +22,8 @@ const WebAuthnClient = { registerNewCredential, }; +const { t } = i18n; + const defaultInvalidPIN = "-1"; const webAuthnClientExceptionName = "WebAuthnClientException"; const ERROR_CODE = "ERROR_CODE"; @@ -35,20 +38,44 @@ function WebAuthnClientException(message, code = ERROR_CODE) { return formattedError; } +/** + * Used to directly request a challenge from the RP to be used to validate a credential for usernameless login + * @returns challenge request to be signed by the user of a discoverable credential + */ async function getPublicKeyRequestOptions(): Promise { try { const response = await axios.get("/users/credentials/fido2/authenticate"); - console.log( - "WebAuthnClient getPublicKeyRequestOptions() response: ", + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getPublicKeyRequestOptions()", + LOG_REASON: t("console.reason.webauthnClient2"), + }), response ); return response.data; } catch (error) { - console.error("WebAuthnClient getPublicKeyRequestOptions() error: ", error); + console.error( + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "getPublicKeyRequestOptions", + REASON: t("console.reason.webauthnClient0"), + }), + error + ); throw error; } } +/** + * Method to invoke the usernamless sign in of a user - handles the full process including: + * 1) Request challenge response + * 2) Calls to the RP to get a challenge to sign + * 3) Attempts to locate a discoverable/resident credential using the rpId using WebAuth.get() + * 4) Signs the challenge and presents it to the RP + * Used to populate the user handle, and challenge in the SignIn() method if no username was provided by the user + * @returns An object that contains + */ async function getUsernamelessAuthChallegeResponse() { try { const requestOptions = await getPublicKeyRequestOptions(); @@ -56,20 +83,34 @@ async function getUsernamelessAuthChallegeResponse() { const publicKey = { publicKey: requestOptions.publicKeyCredentialRequestOptions, }; - console.log( - "WebAuthnClient getUsernamelessAuthChallegeResponse() publicKey: ", + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getUsernamelessAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient3"), + }), publicKey ); const assertionResponse = await get(publicKey); - console.log( - "WebAuthnClient getUsernamelessAuthChallegeResponse() assertionResponse: ", + + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getUsernamelessAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient4"), + }), assertionResponse ); const userhandle = assertionResponse.response.userHandle; // Sign in to Amazon Cognito with userhandle as the `username` - console.log( - "WebAuthnClient getUsernamelessAuthChallegeResponse() userhandle: ", + + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getUsernamelessAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient5"), + }), userhandle ); @@ -78,47 +119,80 @@ async function getUsernamelessAuthChallegeResponse() { requestId: requestOptions.requestId, pinCode: defaultInvalidPIN, }; - console.log( - "WebAuthnClient getUsernamelessAuthChallegeResponse() challengeResponse: ", + + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getUsernamelessAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient6"), + }), challengeResponse ); return { challengeResponse, userhandle }; } catch (error) { console.error( - "WebAuthnClient getUsernamelessAuthChallegeResponse() error: ", + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "getUsernamelessAuthChallegeResponse", + REASON: t("console.reason.webauthnClient0"), + }), error ); throw error; } } +/** + * Wrapper to run the WebAuthn.get() method + * Accepts the challenge issued by the Relying Party - Will attempt to sign the challenge using one of the credentials that are contained in the PublicKeyCredential options + * This method is only used to Sign In the user, this works under the assumption that a credential has been registered to an account + * More information can be found here: https://www.w3.org/TR/webauthn-2/#publickeycredential + * @param cognitoChallenge Object containing the PublicKeyCredential object, which includes the RP challenge + * @returns The signed challenge to return to the RP + * An error may be returned if the get() method is cancelled, or there are no registered credentials to sign in the user + */ async function getAuthChallegeResponse(cognitoChallenge) { try { - console.log( - `WebAuthnClient getAuthChallegeResponse() cognitoChallenge response: ${JSON.stringify( - cognitoChallenge, - null, - 2 - )}` + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient7"), + }), + JSON.stringify(cognitoChallenge, null, 2) ); const request = JSON.parse( cognitoChallenge.publicKeyCredentialRequestOptions ); - console.log("WebAuthnClient getAuthChallegeResponse() request: ", request); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient8"), + }), + request + ); const publicKey = { publicKey: request.publicKeyCredentialRequestOptions }; - console.log( - "WebAuthnClient getAuthChallegeResponse() publicKey: ", + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient3"), + }), publicKey ); const assertionResponse = await get(publicKey); - console.log( - `WebAuthnClient getAuthChallegeResponse() assertion response: ${JSON.stringify( - assertionResponse - )}` + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient3"), + }), + assertionResponse ); const challengeResponse = { @@ -126,44 +200,75 @@ async function getAuthChallegeResponse(cognitoChallenge) { requestId: request.requestId, pinCode: defaultInvalidPIN, }; - console.log( - "WebAuthnClient getAuthChallegeResponse() challengeResponse: ", + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getAuthChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient6"), + }), challengeResponse ); return challengeResponse; } catch (error) { - console.error("WebAuthnClient getAuthChallegeResponse() error: ", error); + console.error( + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "getAuthChallegeResponse", + REASON: t("console.reason.webauthnClient0"), + }), + error + ); throw error; } } +/** + * Wrapper to run the WebAuthn.create() method + * Accepts a PublicKeyCredential object from the RP that contains the metadata necessary to generate a new credential on an authenticator + * This method is only used on initial user registration + * This method also has special logic for different registration flows for browsers and platforms leveraging WebKit from Apple - IOS and MacOS devices require an additional user prompt to generate the credential + * @param cognitoChallenge PublicKeyCredential from the RP containing the initial challenge to sign, RP name and ID, userhandles, and authenticator options when creating the credential + * @param registerWebKit Callback method sent by the parent component to display an additional prompt to adhere to WebKit's requirement to generate credentials only on user gesture + * @returns Challenge response containing the new credential that was generated by the create() method + */ async function getCreateCredentialChallegeResponse( cognitoChallenge, registerWebKit ) { try { - console.log( - `WebAuthnClient getCreateCredentialChallegeResponse() cognitoChallenge response: ${JSON.stringify( - cognitoChallenge, - null, - 2 - )}` + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getCreateCredentialChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient7"), + }), + JSON.stringify(cognitoChallenge, null, 2) ); const request = JSON.parse( cognitoChallenge.publicKeyCredentialCreationOptions ); - console.log( - "WebAuthnClient getCreateCredentialChallegeResponse() request: ", + + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getCreateCredentialChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient8"), + }), request ); const publicKey = { publicKey: request.publicKeyCredentialCreationOptions }; publicKey.publicKey.authenticatorSelection.residentKey = publicKey.publicKey.authenticatorSelection.residentKey.toLowerCase(); - console.log( - "WebAuthnClient getCreateCredentialChallegeResponse() publicKey: ", + + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getCreateCredentialChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient3"), + }), publicKey ); @@ -207,30 +312,23 @@ async function getCreateCredentialChallegeResponse( if (handleCreateOption === -1) { // Non Apple + Safari request, proceed as normal - console.log( - "WebAuthnClient getCreateCredentialChallegeResponse() handleCreationOption: Handling non-Apple/non-Safari login" - ); attestationResponse = await create(publicKey); } else if (handleCreateOption === 1) { // Mac + Safari request, trigger promise with TouchID - console.log( - "WebAuthnClient getCreateCredentialChallegeResponse() handleCreationOption: Handling Mac Safari login" - ); attestationResponse = await registerWebKit("macos", publicKey); } else if (handleCreateOption === 2) { // iPhone + Safari request, trigger promise with FaceID - console.log( - "WebAuthnClient getCreateCredentialChallegeResponse() handleCreationOption: Handling iPhone Safari login" - ); attestationResponse = await registerWebKit("ios", publicKey); } /** Come back right here, and add the undercase treatment to the resident key value */ - - console.log( - `WebAuthnClient getCreateCredentialChallegeResponse() attestationResponse: ${JSON.stringify( - attestationResponse - )}` + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getCreateCredentialChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient3"), + }), + attestationResponse ); const challengeResponse = { @@ -238,15 +336,24 @@ async function getCreateCredentialChallegeResponse( requestId: request.requestId, pinCode: defaultInvalidPIN, }; - console.log( - "WebAuthnClient getCreateCredentialChallegeResponse() challengeResponse: ", + + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "getCreateCredentialChallegeResponse()", + LOG_REASON: t("console.reason.webauthnClient6"), + }), challengeResponse ); return challengeResponse; } catch (error) { console.error( - "WebAuthnClient getCreateCredentialChallegeResponse() error: ", + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "getCreateCredentialChallegeResponse()", + REASON: t("console.reason.webauthnClient0"), + }), error ); throw error; @@ -259,6 +366,11 @@ function getUVFromAssertion(authenticatorData) { return getUV(buffer); } +/** + * Method used to determine if UV was present when attempting to use the credential + * @param attestationObject Authenticator data which can signal if UV was present during the credential ceremony + * @returns True if UV was present, False otherwise + */ function getUVFromAttestation(attestationObject) { const attestationBuffer = base64url.toBuffer(attestationObject); const attestationStruct = cbor.decodeAllSync(attestationBuffer)[0]; @@ -267,6 +379,11 @@ function getUVFromAttestation(attestationObject) { return getUV(buffer); } +/** + * Method used to determine if UV was present when attempting to use the credential + * @param buffer Authenticator data which can signal if UV was present during the credential ceremony + * @returns True if UV was present, False otherwise + */ function getUV(buffer) { const flagsBuf = buffer.slice(32, 33); const flagsInt = flagsBuf[0]; @@ -280,28 +397,59 @@ function getUV(buffer) { return flags.uv; } +/** + * Method used to sign in the user from the Login screen flow + * @param name Username of the user to authenticate - may be undefined which will signal to the method to use usernameless authentication + * @param requestUV Callback method to trigger a modal to prompt the user to provide a U2F Password if UV is not present during the WebAuthn.get() ceremony + * @returns an object containing user credentials that can be used to access application resources + */ async function signIn(name, requestUV) { - console.log("WebAuthnClient signIn() name=", name); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signIn()", + LOG_REASON: t("console.reason.webauthnClient5"), + }), + name + ); try { let username; let challengeResponse; if (name === undefined) { - console.log("WebAuthnClient signIn() usernameless flow"); - // username = await getUsernamelessAuthChallegeResponse(); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signIn()", + LOG_REASON: t("console.reason.webauthnClient9"), + }) + ); const userhandleChallengeResponse = await getUsernamelessAuthChallegeResponse(); username = userhandleChallengeResponse.userhandle; challengeResponse = userhandleChallengeResponse.challengeResponse; } else { - console.log("WebAuthnClient signIn() username flow"); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signIn()", + LOG_REASON: t("console.reason.webauthnClient10"), + }) + ); username = name.toLocaleLowerCase(); localStorage.setItem("username", username); } const cognitoUser = await Auth.signIn(username); - console.log("WebAuthnClient signIn() CognitoUser: ", cognitoUser); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signIn()", + LOG_REASON: t("console.reason.webauthnClient11"), + }), + cognitoUser + ); if ( cognitoUser.challengeName === "CUSTOM_CHALLENGE" && @@ -316,30 +464,27 @@ async function signIn(name, requestUV) { cognitoUser.challengeParam.type === "webauthn.get" ) { if (challengeResponse === undefined) { - console.log( - "WebAuthnClient signIn() get challenge response for username flow" - ); challengeResponse = await getAuthChallegeResponse( cognitoUser.challengeParam ); } - console.log( - "WebAuthnClient signIn() challengeResponse: ", - challengeResponse - ); - const isUserVerified = getUVFromAssertion( challengeResponse.credential.response.authenticatorData ); - console.log("WebAuthnClient signIn() isUserVerified: ", isUserVerified); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signIn()", + LOG_REASON: t("console.reason.webauthnClient12"), + }), + isUserVerified + ); let pin = defaultInvalidPIN; if (isUserVerified == false) { - console.log("WebAuthnClient signIn() requesting UV: "); pin = await requestUV(challengeResponse); } - console.log("WebAuthnClient signIn() sending challenge answer"); const userData = await sendChallengeAnswer( cognitoUser, challengeResponse, @@ -351,25 +496,51 @@ async function signIn(name, requestUV) { // TODO move dispatch to UI logic // dispatch(alertActions.error("Invalid server response")); console.error( - "WebAuthnClient signIn() error: throw WebAuthnClientException" + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "signIn()", + REASON: t("console.reason.webauthnClient0"), + }) ); throw WebAuthnClientException("Invalid server response"); } } catch (error) { - console.error("WebAuthnClient signIn() error: ", error); + console.error( + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "signIn()", + REASON: t("console.reason.webauthnClient0"), + }), + error + ); // TODO move dispatch to UI logic // dispatch(alertActions.error(err.message)); throw error; } } +/** + * Method used to send the challenge response back to the RP to prove that the user has a valid credential + * @param cognitoUser Data on the user provided by the IAM + * @param challengeResponse Contains data about the credential to send back to the RP to validate that it's valid + * @param pin U2F Password to validate the user if their authenticator did not prompt for UV + * @returns user data containing user credentials if the challenge was signed correctly, an error will be thrown if the signed challenge was not provided + */ async function sendChallengeAnswer( cognitoUser, challengeResponse, pin = defaultInvalidPIN ) { challengeResponse.pinCode = parseInt(pin); - console.log("WebAuthnClient sendChallengeAnswer(): ", challengeResponse); + + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "sendChallengeAnswer()", + LOG_REASON: t("console.reason.webauthnClient6"), + }), + challengeResponse + ); let userData; @@ -379,7 +550,14 @@ async function sendChallengeAnswer( JSON.stringify(challengeResponse) ); - console.log("WebAuthnClient sendChallengeAnswer user: ", user); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "sendChallengeAnswer()", + LOG_REASON: t("console.reason.webauthnClient11"), + }), + user + ); userData = { id: 1, @@ -387,12 +565,15 @@ async function sendChallengeAnswer( credential: challengeResponse.credential, }; localStorage.setItem("user", JSON.stringify(userData)); - console.log( - "WebAuthnClient sendChallengeAnswer userData: ", - localStorage.getItem("user") - ); } catch (error) { - console.error("WebAuthnClient sendCustomChallengeAnswer() error: ", error); + console.error( + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "sendCustomChallengeAnswer()", + REASON: t("console.reason.webauthnClient0"), + }), + error + ); // TODO move dispatch to UI logic // dispatch(alertActions.error(err.message)); throw error; @@ -400,8 +581,26 @@ async function sendChallengeAnswer( return userData; } +/** + * Method used to register a new user. The process goes: + * 1) Create the user in Cognito + * 2) Sign in the user directly in Cognito to ensure the user was created + * 3) Attempt to register the first user credential + * 4) Create the credential, then attempt to authenticate by sending a signed challenge + * @param name username of the user to create + * @param requestUV callback used to trigger modal if UV is not present on the authenticator allowing the user to provide a U2F Password + * @param registerWebKit Callback method sent by the parent component to display an additional prompt to adhere to WebKit's requirement to generate credentials only on user gesture + * @returns user data containing user credentials if the challenge was signed correctly, an error will be thrown if the signed challenge was not provided + */ async function signUp(name, requestUV, registerWebKit) { - console.log("WebAuthnClient signUp() name=", name); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signUp()", + LOG_REASON: t("console.reason.webauthnClient13"), + }), + name + ); // Start Registration // First, Cognito needs to make an account for the user @@ -420,12 +619,24 @@ async function signUp(name, requestUV, registerWebKit) { password, attributes, }); - console.log("SignUp: ", user); } catch (error) { // A user can get here if they come back to register after the initial registration was interrupted if (error.code === "UsernameExistsException") { - console.error(error); - console.log("Will attempt to continue the method"); + console.error( + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "signUp()", + REASON: t("console.reason.webauthnClient1"), + }), + error + ); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signUp()", + LOG_REASON: t("console.reason.webauthnClient14"), + }) + ); } else { throw error; } @@ -434,7 +645,14 @@ async function signUp(name, requestUV, registerWebKit) { // Second, register a webauthn credential associated with the user account try { const cognitoUser = await Auth.signIn(username); - console.log("WebAuthnClient signUp() CognitoUser: ", cognitoUser); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signUp()", + LOG_REASON: t("console.reason.webauthnClient11"), + }), + cognitoUser + ); if ( cognitoUser.challengeName === "CUSTOM_CHALLENGE" && @@ -452,43 +670,69 @@ async function signUp(name, requestUV, registerWebKit) { cognitoUser.challengeParam, registerWebKit ); - console.log( - "WebAuthnClient signUp() challengeResponse: ", - challengeResponse - ); const isUserVerified = getUVFromAttestation( challengeResponse.credential.response.attestationObject ); - console.log("WebAuthnClient signUp() isUserVerified: ", isUserVerified); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signUp()", + LOG_REASON: t("console.reason.webauthnClient12"), + }), + isUserVerified + ); let pin = defaultInvalidPIN; if (isUserVerified == false) { - console.log("WebAuthnClient signUp() requesting UV: "); pin = await requestUV(challengeResponse); } - console.log("WebAuthnClient signUp() sending challenge answer"); const userData = await sendChallengeAnswer( cognitoUser, challengeResponse, pin ); - console.log("WebAuthnClient signUp() userData: ", userData); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "signUp()", + LOG_REASON: t("console.reason.webauthnClient15"), + }), + userData + ); return userData; } else { console.error( - "WebAuthnClient signUp() error: throw WebAuthnClientException" + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "signUp()", + REASON: t("console.reason.webauthnClient0"), + }) ); throw WebAuthnClientException("Invalid server response"); } } catch (error) { - console.error("WebAuthnClient signUp() error: ", error); + console.error( + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "signUp()", + REASON: t("console.reason.webauthnClient0"), + }), + error + ); throw error; } } +/** + * Method used to create a new credential for a user that is 1) already created 2) already authenticated + * @param nickname userhandle for the user + * @param isResidentKey boolean used to indicate if a resident key should be created: https://www.w3.org/TR/webauthn-2/#enum-residentKeyRequirement (true is required, false is discouraged) + * @param authenticatorAttachment used to indicate whether the new credential should be resolved as a cross-platform or platform authenticator + * @param requestUV callback used to trigger modal if UV is not present on the authenticator allowing the user to provide a U2F Password + */ async function registerNewCredential( nickname, isResidentKey, @@ -496,11 +740,18 @@ async function registerNewCredential( requestUV ) { try { - console.log("WebAuthnClient registerNewCredential() begin: ", { - nickname, - isResidentKey, - authenticatorAttachment, - }); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "registerNewCredential()", + LOG_REASON: t("console.reason.webauthnClient16"), + }), + { + nickname, + isResidentKey, + authenticatorAttachment, + } + ); const startRegistrationResponse = await axios.post( "/users/credentials/fido2/register", { @@ -510,8 +761,12 @@ async function registerNewCredential( } ); - console.log( - "WebAuthnClient registerNewCredential() Registration Response: ", + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "registerNewCredential()", + LOG_REASON: t("console.reason.webauthnClient17"), + }), startRegistrationResponse ); @@ -521,18 +776,29 @@ async function registerNewCredential( publicKey: startRegistrationResponse.data.publicKeyCredentialCreationOptions, }; - console.log("publlicKey: ", publicKey); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "registerNewCredential()", + LOG_REASON: t("console.reason.webauthnClient3"), + }), + publicKey + ); const makeCredentialResponse = await create(publicKey); - console.log( - "WebAuthnClient registerNewCredential() Make Credential: ", + + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "registerNewCredential()", + LOG_REASON: t("console.reason.webauthnClient18"), + }), makeCredentialResponse ); const uv = getUVFromAttestation( makeCredentialResponse.response.attestationObject ); - console.log("uv: ", uv); const challengeResponse = { credential: makeCredentialResponse, @@ -541,7 +807,14 @@ async function registerNewCredential( pinCode: defaultInvalidPIN, nickname, }; - console.log("challengeResponse: ", challengeResponse); + console.info( + t("console.info", { + COMPONENT: "WebAuthnClient", + METHOD: "registerNewCredential()", + LOG_REASON: t("console.reason.webauthnClient6"), + }), + challengeResponse + ); if (uv === true) { await credentialService.registerFinish(challengeResponse); @@ -553,12 +826,18 @@ async function registerNewCredential( } } else { const uvPin = await requestUV(challengeResponse); - console.log("AddCredential, new Key PIN is: ", uvPin); challengeResponse.pinCode = uvPin; await credentialService.registerFinish(challengeResponse); } } catch (error) { - console.error("WebAuthnClient registerNewCredential() error: ", error); + console.error( + t("console.error", { + COMPONENT: "WebAuthnClient", + METHOD: "registerNewCredential()", + REASON: t("console.reason.webauthnClient0"), + }), + error + ); throw error; } } diff --git a/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.tsx b/clients/web/react/src/_components/u2fPassword/u2fPassword.tsx similarity index 82% rename from clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.tsx rename to clients/web/react/src/_components/u2fPassword/u2fPassword.tsx index 125d38c..bebabaa 100644 --- a/clients/web/react/src/_components/ServerVerifiedPin/ServerVerifiedPin.tsx +++ b/clients/web/react/src/_components/u2fPassword/u2fPassword.tsx @@ -7,17 +7,17 @@ import { validate } from "validate.js"; const styles = require("../component.module.css"); /** - * Modal that shows the server verified PIN menu allowing the user to SET or CHANGE the pin based on the type of request + * Modal that shows the U2F Password menu allowing the user to SET or CHANGE the pin based on the type of request * Request types can be seen below - * This component should be treated as a promise, due to the way that it's consumed by the WebAuthN component + * This component should be treated as a promise, due to the way that it's consumed by the WebAuthn component * Handle Close will always resolve the closeCallback, resulting in an error - * Handle Save will always resolve the saveCallback, resulting in the sending of new PIN information + * Handle Save will always resolve the saveCallback, resulting in the sending of new U2F Password information * @param props * props.type: "create" | "change" | "dispatch" [default] * props.saveCallback: method to call on save, passes fields as the argument * props.closeCallback: method to call when closing the flow, is used to reject a promise */ -const ServerVerifiedPin = function (props) { +const U2FPassword = function (props) { const { t } = useTranslation(); const [pinCollection, setPinCollection] = useState({ @@ -44,10 +44,10 @@ const ServerVerifiedPin = function (props) { const inputRefNext = useRef(null); const [label, setLabel] = useState({ - buttonText: "", - modalHeader: "", - modalText: "", - modalSubmitText: "", + buttonText: t("sv-pin.modal-default"), + modalHeader: t("sv-pin.modal-default"), + modalText: t("sv-pin.modal-default"), + modalSubmitText: t("sv-pin.modal-default"), }); const constraints = { @@ -70,48 +70,48 @@ const ServerVerifiedPin = function (props) { /** * This method is used to configure the labels on the component depending on the type of UV dispatch that is sent from the parent component * @param {*} type possible values are: - * create: Sent by the registration flow to create a new SVPIN upon initial registration - * change: Sent by the homepage when a user wants to change their SVPIN - * dispatch: Sent by login when a user needs to enter their SVPIN when logging into the service + * create: Sent by the registration flow to create a new U2F Password upon initial registration + * change: Sent by the homepage when a user wants to change their U2F Password + * dispatch: Sent by login when a user needs to enter their U2F Password when logging into the service */ const configureModal = (type) => { switch (type) { case "create": setLabel({ - buttonText: "", - modalHeader: "Create U2F Password", - modalText: "Please create a U2F Password", - modalSubmitText: "Submit U2F Password", + buttonText: t("sv-pin.modal-buttontext-create"), + modalHeader: t("sv-pin.modal-header-create"), + modalText: t("sv-pin.modal-text-create"), + modalSubmitText: t("sv-pin.modal-submittext-create"), }); setShowButton(false); setShowConfirmPin(true); break; case "change": setLabel({ - buttonText: "Change your U2F Password", - modalHeader: "Change your U2F Password", - modalText: "Enter your new U2F Password information", - modalSubmitText: "Change U2F Password", + buttonText: t("sv-pin.modal-buttontext-change"), + modalHeader: t("sv-pin.modal-header-change"), + modalText: t("sv-pin.modal-text-change"), + modalSubmitText: t("sv-pin.modal-submittext-change"), }); setShowButton(true); setShowConfirmPin(true); break; case "dispatch": setLabel({ - buttonText: "", - modalHeader: "U2F Password", - modalText: "Enter your U2F Password", - modalSubmitText: "Submit", + buttonText: t("sv-pin.modal-buttontext-dispatch"), + modalHeader: t("sv-pin.modal-header-dispatch"), + modalText: t("sv-pin.modal-text-dispatch"), + modalSubmitText: t("sv-pin.modal-submittext-dispatch"), }); setShowButton(false); setShowConfirmPin(false); break; default: setLabel({ - buttonText: "", - modalHeader: "", - modalText: "", - modalSubmitText: "", + buttonText: t("sv-pin.modal-default"), + modalHeader: t("sv-pin.modal-default"), + modalText: t("sv-pin.modal-default"), + modalSubmitText: t("sv-pin.modal-default"), }); break; } @@ -162,11 +162,7 @@ const ServerVerifiedPin = function (props) { * Closes the modal, and calls to the reject promise indicating that an error occurred */ const handleClose = () => { - props.closeCallback( - new Error( - "PIN Registration Ended - Please attempt to register your security key" - ) - ); + props.closeCallback(new Error(t("sv-pin.pin-error"))); setShow(false); setInvalidPin(undefined); setInvalidConfirmPin(undefined); @@ -294,4 +290,4 @@ const ServerVerifiedPin = function (props) { ); }; -export default ServerVerifiedPin; +export default U2FPassword; diff --git a/clients/web/react/src/_services/credential.service.ts b/clients/web/react/src/_services/credential.service.ts index 2e0c276..6e1420f 100644 --- a/clients/web/react/src/_services/credential.service.ts +++ b/clients/web/react/src/_services/credential.service.ts @@ -1,7 +1,6 @@ -// import config from 'config'; -// import { authHeader } from '../_helpers'; import axios from "axios"; import aws_exports from "../aws-exports"; +import { i18n } from "../i18n"; axios.defaults.baseURL = aws_exports.apiEndpoint; @@ -13,17 +12,32 @@ const credentialService = { registerStart, registerFinish, getAll, - // getById, delete: _delete, }; +const { t } = i18n; + async function generateRecoveryCodes() { try { const response = await axios.delete("/users/credentials/codes"); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "credential.service", + METHOD: "generateRecoveryCodes()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "credential.service", + METHOD: "generateRecoveryCodes()", + REASON: "Error generating recovery code", + }), + error + ); Promise.reject(error); } } @@ -34,10 +48,24 @@ async function listRecoveryCodes() { return; } const response = await axios.get("/users/credentials/codes"); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "credential.service", + METHOD: "listRecoveryCodes()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "credential.service", + METHOD: "listRecoveryCodes()", + REASON: "Error listing recovery code", + }), + error + ); Promise.reject(error); } } @@ -45,10 +73,24 @@ async function listRecoveryCodes() { async function update(credential) { try { const response = await axios.put("/users/credentials/fido2", credential); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "credential.service", + METHOD: "update()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "credential.service", + METHOD: "update()", + REASON: "Error updating credential", + }), + error + ); Promise.reject(error); } } @@ -56,10 +98,24 @@ async function update(credential) { async function updatePin(fields) { try { const response = await axios.post("/users/credentials/pin", fields); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "credential.service", + METHOD: "update()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "credential.service", + METHOD: "updatePin()", + REASON: "Error updating PIN", + }), + error + ); Promise.reject(error); } } @@ -68,26 +124,29 @@ async function getAll(jwt) { axios.defaults.headers.common["Authorization"] = jwt; try { const response = await axios.get("/users/credentials"); - console.log("getAll response: ", response); + console.info( + t("console.info", { + COMPONENT: "credential.service", + METHOD: "getAll()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "credential.service", + METHOD: "getAll()", + REASON: "Error getting credentials", + }), + error + ); Promise.reject(error); throw Error(error); } } -/* -function getById(id) { - const requestOptions = { - method: 'GET', - headers: authHeader() - }; - - return fetch(`${config.apiUrl}/credentials/${id}`, requestOptions).then(handleResponse); -} -*/ - async function registerStart(registration) { console.log("registraiton: ", registration); try { @@ -95,10 +154,24 @@ async function registerStart(registration) { "/users/credentials/fido2/register", registration ); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "credential.service", + METHOD: "registerStart()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "credential.service", + METHOD: "registerStart()", + REASON: "Error beginning registration", + }), + error + ); Promise.reject(error); } } @@ -109,10 +182,24 @@ async function registerFinish(registration) { "/users/credentials/fido2/register/finish", registration ); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "credential.service", + METHOD: "registerFinish()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error.response); + console.error( + t("console.error", { + COMPONENT: "credential.service", + METHOD: "registerFinish()", + REASON: "Error registering credentials", + }), + error.response + ); Promise.reject(error.response.data); throw new Error(error.response.data); @@ -123,32 +210,26 @@ async function registerFinish(registration) { async function _delete(id) { try { const response = await axios.delete(`/users/credentials/fido2?id=${id}`); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "credential.service", + METHOD: "_delete()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "credential.service", + METHOD: "_delete()", + REASON: "Error deleting credentials", + }), + error + ); Promise.reject(error); } } -/* -function handleResponse(response) { - return response.text().then(text => { - const data = text && JSON.parse(text); - if (!response.ok) { - if (response.status === 401) { - // auto logout if 401 response returned from api - logout(); - location.reload(true); - } - - const error = (data && data.message) || response.statusText; - return Promise.reject(error); - } - - return data; - }); -} -*/ - export default credentialService; diff --git a/clients/web/react/src/_services/user.service.ts b/clients/web/react/src/_services/user.service.ts index ed5cb1c..ae0c59c 100644 --- a/clients/web/react/src/_services/user.service.ts +++ b/clients/web/react/src/_services/user.service.ts @@ -1,5 +1,6 @@ import { Auth } from "aws-amplify"; import axios from "axios"; +import { i18n } from "../i18n"; import aws_exports from "../aws-exports"; axios.defaults.baseURL = aws_exports.apiEndpoint; @@ -12,13 +13,29 @@ const userService = { getCurrentAuthenticatedUser, }; +const { t } = i18n; + async function webAuthnStart() { try { const response = await axios.get("/users/credentials/fido2/authenticate"); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "user.service", + METHOD: "webAuthnStart()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "user.service", + METHOD: "webAuthnStart()", + REASON: "Authentication error", + }), + error + ); Promise.reject(error); } } @@ -29,7 +46,14 @@ async function logout() { try { await Auth.signOut(); } catch (error) { - console.log("Error while signing out", error); + console.error( + t("console.error", { + COMPONENT: "user.service", + METHOD: "logout()", + REASON: "Error signing out", + }), + error + ); } } @@ -55,10 +79,24 @@ async function _delete(jwt) { axios.defaults.headers.common["Authorization"] = jwt; try { const response = await axios.delete("/users"); - console.log(response); + console.info( + t("console.info", { + COMPONENT: "user.service", + METHOD: "_delete()", + LOG_REASON: "Success", + }), + response + ); return response.data; } catch (error) { - console.error(error); + console.error( + t("console.error", { + COMPONENT: "user.service", + METHOD: "logout()", + REASON: "Error deleting user", + }), + error + ); Promise.reject(error); } } @@ -68,13 +106,24 @@ async function getCurrentAuthenticatedUser() { const currentUser = await Auth.currentAuthenticatedUser({ bypassCache: true, // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data }); - console.log( - "getCurrentAuthenticatedUser currentAuthenticatedUser", + console.info( + t("console.info", { + COMPONENT: "user.service", + METHOD: "getCurrentAuthenticatedUser()", + LOG_REASON: "current user", + }), currentUser ); const data = await Auth.currentSession(); - console.log("getCurrentAuthenticatedUser data: ", data); + console.info( + t("console.info", { + COMPONENT: "user.service", + METHOD: "getCurrentAuthenticatedUser()", + LOG_REASON: "current user data", + }), + data + ); const userData = { id: 1, username: currentUser.username, diff --git a/clients/web/react/src/i18n.ts b/clients/web/react/src/i18n.ts index f002d13..d0d294a 100644 --- a/clients/web/react/src/i18n.ts +++ b/clients/web/react/src/i18n.ts @@ -28,4 +28,10 @@ function onLanguageChanged(callback: (language: string) => void) { return i18n.on("languageChanged", callback); } -export { initI18n, getCurrentLanguage, changeLanguage, onLanguageChanged }; +export { + initI18n, + getCurrentLanguage, + changeLanguage, + onLanguageChanged, + i18n, +}; diff --git a/scripts/Mac-Linux/deployStarterKit.json b/scripts/Mac-Linux/deployStarterKit.json index 314f041..4b69a8f 100644 --- a/scripts/Mac-Linux/deployStarterKit.json +++ b/scripts/Mac-Linux/deployStarterKit.json @@ -1,22 +1,22 @@ { - "AWS_CLI_PROFILE": "", - "AWS_REGION":"", - "S3_BUCKET_NAME":"", - "CF_STACK_NAME":"", - "SUFFIX":"", - "USER_POOL_NAME":"", - "DATABASE_NAME":"", - "DATABASE_MASTER_USERNAME":"", - "DATABASE_MASTER_PASSWORD":"", - "DEFINE_AUTH_CHALLENGE_FUNC_NAME":"", - "CREATE_AUTH_CHALLENGE_FUNC_NAME":"", - "VERIFY_AUTH_CHALLENGE_FUNC_NAME":"", - "WEBAUTHN_KIT_API_NAME":"", - "WEBAUTHN_KIT_API_FUNC_NAME":"", - "PRE_SIGNUP_FUNC_NAME":"", - "JAVA_WEBAUTHN_LIB_FUNC_NAME":"", - "CREATE_DATABASE_SCHEMA_FUNC_NAME":"", - "CREATE_DATABASE_SCHEMA_CALLER_FUNC_NAME":"", - "AMPLIFY_HOSTING_APP_NAME":"", - "AMPLIFY_HOSTING_BRANCH_NAME":"" -} \ No newline at end of file + "AWS_CLI_PROFILE": "yubico-dev", + "AWS_REGION": "", + "S3_BUCKET_NAME": "", + "CF_STACK_NAME": "", + "SUFFIX": "rcdemo", + "USER_POOL_NAME": "", + "DATABASE_NAME": "", + "DATABASE_MASTER_USERNAME": "", + "DATABASE_MASTER_PASSWORD": "", + "DEFINE_AUTH_CHALLENGE_FUNC_NAME": "", + "CREATE_AUTH_CHALLENGE_FUNC_NAME": "", + "VERIFY_AUTH_CHALLENGE_FUNC_NAME": "", + "WEBAUTHN_KIT_API_NAME": "", + "WEBAUTHN_KIT_API_FUNC_NAME": "", + "PRE_SIGNUP_FUNC_NAME": "", + "JAVA_WEBAUTHN_LIB_FUNC_NAME": "", + "CREATE_DATABASE_SCHEMA_FUNC_NAME": "", + "CREATE_DATABASE_SCHEMA_CALLER_FUNC_NAME": "", + "AMPLIFY_HOSTING_APP_NAME": "", + "AMPLIFY_HOSTING_BRANCH_NAME": "" +}